bash

Z Wikibooks, biblioteki wolnych podręczników.
(Przekierowano z BASH)
Skocz do: nawigacja, szukaj

Wstęp[edytuj]

Dokumentacja[edytuj]

Za pomocą komendy :[1]

man bash

uzyskamy wersję dokumentacji:

  • aktualną ( odpowiedną dla zainstalowanej wersji Basha)
  • nie wymagającą dostępu do sieci (ang. offline )

Możemy skorzystać ze strony : explainshell [2]

Metaznaki[edytuj]

Metaznaki basha : [3]

  •  ;
  • &
  • (
  • )
  • |
  • <
  • >
  • nl (nowa linia)
  • spacja (odstęp)
  • TAB

wersja[edytuj]

Sprawdzamy wersję BASH'a :

 /bin/bash --version
 GNU bash, version 4.2.8(1)-release (x86_64-pc-linux-gnu)
 Copyright (C) 2011 Free Software Foundation, Inc.
 License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

 This is free software; you are free to change and redistribute it.
 There is NO WARRANTY, to the extent permitted by law.

lub :

dpkg -s bash | grep Version

wynik :

Version: 4.2-5ubuntu3

Bezpieczeństwo[edytuj]

Sprawdzamy czy nasza wersja jest nieodporna na CVE-2014-6271 : [4]

env x='() { :;}; echo vulnerable' bash -c 'echo hello'

Opcje[edytuj]

Opcje Basha [5].

Dodanie flagę "-x" pozwala zobaczyć co dokładnie skrypt robi :

   #!/bin/bash -x


Zmienne środowiskowe[edytuj]

Opis [6][7]

Wyświetlamy :

printenv

przykładowy wynik :


XDG_VTNR=7
SSH_AGENT_PID=1385
XDG_SESSION_ID=c1
GEDIT_CURRENT_DOCUMENT_TYPE=text/plain
CLUTTER_IM_MODULE=xim
SESSION=ubuntu
GPG_AGENT_INFO=/run/user/1000/keyring-iaC4kY/gpg:0:1
TERM=xterm
VTE_VERSION=3406
XDG_MENU_PREFIX=gnome-
GEDIT_DOCUMENTS_PATH=/home/a/drop.sh /home/a/Pobrane/maximus-book/code/bin/mandelbrot_external_ray_out.c /home/a/Pobrane/maximus-book/code/README
SHELL=/bin/bash
GEDIT_CURRENT_LINE=text `echo       "-0.75  0.01"| ./rescale 53 53 $view 0` -0.75+0.01i
WINDOWID=71303676
UPSTART_SESSION=unix:abstract=/com/ubuntu/upstart-session/1000/1295
GNOME_KEYRING_CONTROL=/run/user/1000/keyring-iaC4kY
GTK_MODULES=overlay-scrollbar:unity-gtk-module
GEDIT_CURRENT_DOCUMENT_SCHEME=file
USER=a
JRE_HOME=/usr/local/java/jre1.7.0_45
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lz=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.axv=01;35:*.anx=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.axa=00;36:*.oga=00;36:*.spx=00;36:*.xspf=00;36:
XDG_SESSION_PATH=/org/freedesktop/DisplayManager/Session0
XDG_SEAT_PATH=/org/freedesktop/DisplayManager/Seat0
SSH_AUTH_SOCK=/run/user/1000/keyring-iaC4kY/ssh
GEDIT_CURRENT_DOCUMENT_NAME=README
SESSION_MANAGER=local/zalman:@/tmp/.ICE-unix/1437,unix/zalman:/tmp/.ICE-unix/1437
DEFAULTS_PATH=/usr/share/gconf/ubuntu.default.path
XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/usr/share/upstart/xdg:/etc/xdg
GEDIT_CURRENT_WORD=i
DESKTOP_SESSION=ubuntu
PATH=/usr/lib/lightdm/lightdm:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/a/bin:/usr/local/java/jdk1.7.0_45/bin:/home/a/bin:/usr/local/java/jre1.7.0_45/bin
GEDIT_CURRENT_DOCUMENT_DIR=/home/a/Pobrane/maximus-book/code
PWD=/home/a/Pobrane/maximus-book/code
JOB=dbus
XMODIFIERS=@im=ibus
JAVA_HOME=/usr/local/java/jdk1.7.0_45
LANG=pl_PL.UTF-8
GDM_LANG=pl
MANDATORY_PATH=/usr/share/gconf/ubuntu.mandatory.path
GEDIT_CURRENT_LINE_NUMBER=13
UBUNTU_MENUPROXY=1
COMPIZ_CONFIG_PROFILE=ubuntu
IM_CONFIG_PHASE=1
GDMSESSION=ubuntu
SESSIONTYPE=gnome-session
SHLVL=1
HOME=/home/a
XDG_SEAT=seat0
LANGUAGE=pl
GEDIT_CURRENT_DOCUMENT_PATH=/home/a/Pobrane/maximus-book/code/README
GEDIT_CWD=/home/a
GNOME_DESKTOP_SESSION_ID=this-is-deprecated
UPSTART_INSTANCE=
UPSTART_EVENTS=started xsession
LOGNAME=a
COMPIZ_BIN_PATH=/usr/bin/
DBUS_SESSION_BUS_ADDRESS=unix:abstract=/tmp/dbus-2xmczCQuFO
XDG_DATA_DIRS=/usr/share/ubuntu:/usr/share/gnome:/usr/local/share/:/usr/share/
QT4_IM_MODULE=xim
LESSOPEN=| /usr/bin/lesspipe %s
GEDIT_CURRENT_DOCUMENT_URI=file:///home/a/Pobrane/maximus-book/code/README
INSTANCE=
TEXTDOMAIN=im-config
UPSTART_JOB=gnome-session
XDG_RUNTIME_DIR=/run/user/1000
DISPLAY=:0.0
GEDIT_DOCUMENTS_URI=file:///home/a/drop.sh file:///home/a/Pobrane/maximus-book/code/bin/mandelbrot_external_ray_out.c file:///home/a/Pobrane/maximus-book/code/README
XDG_CURRENT_DESKTOP=Unity
GTK_IM_MODULE=ibus
LESSCLOSE=/usr/bin/lesspipe %s %s
TEXTDOMAINDIR=/usr/share/locale/
XAUTHORITY=/home/a/.Xauthority
COLORTERM=gnome-terminal
_=/usr/bin/printenv

Różne sposoby zmiany wartości :[8]

 name=value
export name=value
name=value program
env name=value program



EDITOR[edytuj]

Nie jest stałą zmienną[9], czasem jest używany link symboliczny. Sprawdzamy to :



which editor

przykładowy wynik :

/usr/bin/editor

Sprawdzamy efekt :

editor

i uruchamia się ...


LANG[edytuj]

Wartość tej zmiennej ma wpływ na:


Sprawdzamy aktualną wartość :

echo $LANG
pl_PL.UTF-8

Dopuszczale wartości znajdujemy za pomocą komendy :[11][12]


locale -a

przykładowy wynik :

C
C.UTF-8
en_AG
en_AG.utf8
en_AU.utf8
en_BW.utf8
en_CA.utf8
en_DK.utf8
en_GB.utf8
en_HK.utf8
en_IE.utf8
en_IN
en_IN.utf8
en_NG
en_NG.utf8
en_NZ.utf8
en_PH.utf8
en_SG.utf8
en_US.utf8
en_ZA.utf8
en_ZM
en_ZM.utf8
en_ZW.utf8
pl_PL.utf8
POSIX


lub w pliku /usr/share/i18n/supported :[13]

# This file names the currently supported and somewhat tested locales.
# If you have any additions please file a glibc bug report.
aa_DJ.UTF-8 UTF-8
aa_DJ ISO-8859-1
aa_ER UTF-8
aa_ER@saaho UTF-8
aa_ET UTF-8
...
pap_AN UTF-8
pl_PL.UTF-8 UTF-8
pl_PL ISO-8859-2
ps_AF UTF-8
pt_BR.UTF-8 UTF-8
pt_BR ISO-8859-1
...


Czasowa zmiana wartości :

export LANG=en_GB.utf8

lub setlocale[14]

LC_NUMERIC[edytuj]

Sprawdzamy wartość :

locale | grep NUM
LC_NUMERIC="pl_PL.UTF-8"


wpływa na dziłanie printf[15]

PATH[edytuj]

Wyświetlamy wartość zmiennej PATH:

echo $PATH

Zmieniamy wartość zmiennej PATH :

PATH="$HOME/.cabal/bin:$PATH"

Zmiana działa:

  • tylko w tym terminalu
  • tylko na czas działania w tym terminalu

W celu stałej zmiany wartości zmiennej PATH dla danego użytkownika należy powyższą instrukcję dodać do swojego pliku

~/.profile 

lub

~/.bash_profile 

lub

~/.bash_login 

Edycja pliku jest możliwa po otwarciu go w trybie administratora.



Położenie pliku w zależności od klasy użytkowników [16]
Klasa użytkowników plik
aktualny $HOME/.bash_profile
wszyscy oprócz su /etc/profile
su (root) /root/.bash_profile

LD_LIBRARY_PATH[edytuj]

Znaczenie [17]

złe ustawienie zmiennej powoduje błąd:[18]

  error while loading shared libraries: lib***.so: cannot open shared object file: No such file or directory


Wyświetlamy

 echo $LD_LIBRARY_PATH

Sprawdzamy lokalizację nieznalezionej biblioteki ( jeśli jest zainstalowana) :

 sudo updatedb
 locate libgmp

zmieniamy czasowo :

 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/


lub na stałe przez wpis (jako root) w pliku

 /etc/ld.so.conf.d/*.conf


Możemy wykorzystać ldconfig:


 sudo ldconfig


Jeśli biblioteka nie jest zainstalowana to :

 apt-cache search <libraryname>

Sposoby pracy[edytuj]

Ręczne wpisywanie poleceń[edytuj]

W konsoli wpisujemy :

which bash

otrzymujemy odpowiedź gdzie jest program obsługujący wiersz poleceń naszej powłoki :

/bin/bash


Skrypty[edytuj]

Polecenia możemy

  • zapisać do pliku tekstowego zwanego skryptem , np. g ( uwaga : często skrypty powłoki mają rozszerzenie sh )
  • plik powinien rozpoczynać się od magicznych znaków [19]) :
#!/bin/bash

lub :

awk
  • nadać mu atrybut wykonywalności ( g oznacza tutaj przykładową nazwę pliku):
chmod +x g
  • uruchomić plik znajdujący się w aktualnym katalogu :
./g

shebang[edytuj]

Shebang jest dwu bajtową magiczną liczbą ( ang. magic number) oznaczającą typ pliku. Więcej o magicznej liczbie :

man magic

Po Shebangu następuje ścieżka do programu wykonującego komendy skryptu.

Lokalizacja skryptu[edytuj]

Skrypt może być :

  • w dowolnym katalogu,
    • uruchamiany z tego katalogu ./nazwa
  • w katalogu ~/bin/ [20]

Sprawdzanie skryptu[edytuj]

  • online [21]
  • debugowanie [22] : #!/bin/bash -x
  • sprawdzanie wyjścia skryptu : echo $?

Heredoc[edytuj]

Opis[23]:

  • kilka komend zostanie wykonanych, a treść tych komend jest przekierowana na stdin programu [24]

Składnia : [25]

program <<LimitString
command #1
command #2
...
LimitString


Przykłady : [26]

Zapisywanie kilku linii tekstu do pliku a.txt z użyciem cat : [27]

cat > a.txt << EOF 
--------------------------
The quick brown fox 
jumped over the lazy dog 
--------------------------
EOF

Języki skryptowe[edytuj]

język nagłówek przenośny nagłówek
bash #!/bin/bash #!/usr/bin/env bash
php #!/usr/bin/php
sed
awk
perl #!/usr/bin/perl #!/usr/bin/env perl
python #!/usr/bin/python #! /usr/bin/env python

Skróty klawiaturowe[edytuj]

Polecenia BASH'a Skrót klawiszowy Opis polecenia
SIGTSTP Ctrl-Z zatrzymuje ( kończy) proces
SIGINT Ctrl-C zawiesza proces ( pauza)

Pliki[edytuj]

Prawa dostępu[edytuj]

Sprawdzanie praw dostępu[edytuj]

setfacl
ls -l


zmienianaie praw dostępu[edytuj]

getfacl

Ile mamy plików na dysku ?[edytuj]

find / -type f | wc -l


Tworzenie animowanego gifa[edytuj]

Przykładowy skrypt uruchamiający komendy z biblioteki ImageMagic tworzące z plików pgm animowany gif :


#!/bin/bash

# script file for BASH 
# which bash
# save this file as g
# chmod +x g
# ./g

i=0
# for all pgm files in this directory
for file in *.pgm ; do
  # b is name of file without extension
  b=$(basename $file .pgm)
  # change file name to integers and count files
  ((i= i+1))
  # convert from pgm to gif and add text ( level ) using ImageMagic
  convert $file -pointsize 50 -annotate +10+100 $b ${i}.gif
  echo $file
done
 
echo convert all gif files to one animated gif_file
convert -delay 50   -loop 1 %d.gif[1-$i] aa${i}.gif
# convert -delay 50 -loop 0 %d.gif[1-$i] b${i}.mpg # it needs ffmpeg
# ffmpeg2theora %d.gif --framerate 12 --videoquality 9  -o output129.ogv

 
echo b${i} OK
# end



lub inna wersja z konwersją z svg :[28]


for i in ??.svg
do
  rsvg $i ${i%svg}png
  convert ${i%svg}png ${i%svg}gif
done
gifsicle --delay 4 --loop --optimize ??.gif > out.gif

Zmiana nazwy plików[edytuj]

Możemy wykorzystać komendy :

lub skrypt :


#!/bin/bash
 
# script file for BASH
# which bash
# save this file as r
# chmod +x r
# ./r
# for all pgm files in this directory
# for all pgm files in this directory
for file in *.pgm ; do
  # remove first 3 chars from old file name
  newfile=${file:3}
  # change name of file
  mv $file $newfile
  echo $newfile
done

echo OK
# end

Kopiowanie plików[edytuj]

Chcemy skopiować : [29][30]

  • tylko pliki z rozszerzeniem c
  • z katalogu ~/c
  • do katalogu ~/temp
  • tak aby zachować podkatalogi

Możemy użyć :

find  ~/c -maxdepth 7 -name "*.c" -exec cp {} -R ~/temp \;

ale w katalogu docelowym nie ma podkatalogów

Inna opcja :

cp -R ~/c  ~/temp

Kopiuje z podkatalogami ale wszystkie pliki.

Działające polecenia :

  • z użyciem find i tar
(cd ~/c ; find  -maxdepth 7 -name "*.c" |tar -T - -c) |tar -C ~/temp -x 
  • z użyciem rsync :
rsync -a --include='*.c' --include='*/' --exclude='*' ~/c/ ~/temp/


Łaty i różnice[edytuj]

Łańcuchy i znaki[edytuj]

Definicje :

  • łańcuch ( ang. string ) inaczej napis czyli ciąg znaków
  • znak

nadawanie wartości[edytuj]

Są trzy różne sposoby [31]

Liczby[edytuj]

Całkowite[edytuj]

Rozkład na liczby pierwsze : ( zobacz man factor) :

factor 27417
27417: 3 13 19 37

ale już :

time factor 237142198758023568227473377297792835283496928595231875152809132048206089502588927
factor: „237142198758023568227473377297792835283496928595231875152809132048206089502588927” jest za duża
real    0m0.001s
user    0m0.000s
sys     0m0.000s

Sekwencje :


seq -w 0 11

wynik :

00
01
02
03
04
05
06
07
08
09
10
11


Zmiennoprzecinkowe[edytuj]

Bash nie wykonuje działań na liczbach zmiennoprzecinkowych. Korzystaj bc, dc, Maxima CAS, perl, python ...


Konwersja postaci naukowej do zmiennoprzecinkowej[edytuj]

Standardowa odpowiedź nie może nie działać : [32]

 printf '%.0f' 1.8200E+02
 bash: printf: 1.8200E+02: nieprawidłowa liczba 0

Zmieniamy lokalnie ustawienia językowe (LC_NUMERIC)  :

LC_NUMERIC="en_US.UTF-8" printf "%f\n" 1.8200E+02
182.000000

i działa jak oczekujemy.

Jeśli chcemy zapisać rezultat konwersji do zmiennej to : [33]

radius="1.5e-1"
radius=$(LC_NUMERIC="en_US.UTF-8" printf "%f\n" $radius)

System[edytuj]

Informacje dostępne za pomocą cat: [34]

cat /proc/cpuinfo
cat /proc/meminfo
cat /proc/version
cat /proc/scsi/scsi 
cat /proc/partitions 

lub lista:

  • cpu = lscpu
  • sprzętu = lshw ( list hardware ):[35]
  • pci = lspci
  • scsi = lsscsi
  • usb = lsusb
  • urządzeń blokowych : lsblk

Przykłady :

sudo lshw -short
lsblk -o KNAME,TYPE,SIZE,MODEL


Sprawdzanie kolejności bajtów ( ang. endianess ) :


 lscpu

przykładowy wynik :


Architecture:          x86_64
Tryb(y) pracy CPU:     32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Wątków na rdzeń:    2
Rdzeni na gniazdo:     4
Socket(s):             1
Węzłów NUMA:        1
ID producenta:         GenuineIntel
Rodzina CPU:           6
Model:                 60
Model name:            Intel(R) Core(TM) i7-4770 CPU @ 3.40GHz
Wersja:                3
CPU MHz:               3401.195
CPU max MHz:           3900,0000
CPU min MHz:           800,0000
BogoMIPS:              6784.73
Wirtualizacja:         VT-x
Cache L1d:             32K
Cache L1i:             32K
Cache L2:              256K
Cache L3:              8192K
NUMA node0 CPU(s):     0-7
Flags:                 fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe syscall nx pdpe1gb rdtscp lm constant_tsc arch_perfmon pebs bts rep_good nopl xtopology nonstop_tsc aperfmperf eagerfpu pni pclmulqdq dtes64 monitor ds_cpl vmx smx est tm2 ssse3 sdbg fma cx16 xtpr pdcm pcid sse4_1 sse4_2 x2apic movbe popcnt tsc_deadline_timer aes xsave avx f16c rdrand lahf_lm abm epb tpr_shadow vnmi flexpriority ept vpid fsgsbase tsc_adjust bmi1 hle avx2 smep bmi2 erms invpcid rtm xsaveopt dtherm ida arat pln pts


Info o sprzęcie :

  • hwinfo
  • skrypt basha Inxi
  • przestrzeń dysków
    • wersja standardowa = df
    • wersja w Pythonie = pydf
  • zamontowane urządzenie = mount
  • pamięć RAM = free
  • urządzenia SATA = hdparm

Przykłady :[36]

inxi -Fx
mount | column -t
free -m
sudo hdparm -i /dev/sda
fdisk -l
parted -l

Polecenia[edytuj]

Zobacz również[edytuj]

Przypisy[edytuj]

  1. man - polecenie systemu Unix uruchomiane z wiersza poleceń powłoki systemowej
  2. | explainshell
  3. Powłoka systemu UNIX- dr inż. Edward Śliwa
  4. What is the CVE-2014-6271 bash vulnerability, and how do I fix it?
  5. Bash options
  6. Zmienna środowiskowa w wikipedii
  7. Environment Variables
  8. : env
  9. [1]
  10. is in a number of the /etc/init.d/* scripts. What does LANG=C do and why do you need to set LANG=C.
  11. to change the bash shell language ?
  12. Locale w wikipedii
  13. doc 8.3. The locale
  14. - Linux man page
  15. [http://stackoverflow.com/questions/12845997/unexplicable-error-in-bash-printf-command-inside-a-script-returns-invalid-numb STackoverflow : Unexplicable error in bash: printf command inside a script returns “invalid number” ]
  16. [Troubleshooters.Com and T.C Linux Library Present : Adding a Directory to the Path by Steve Litt]
  17. ubuntu environment Variables
  18. stackoverflow question: linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s
  19. Shebang w wikipedii
  20. The Beginner’s Guide to Shell Scripting: The Basics
  21. | spellcheck
  22. tldp - something goes wrong (debugging)
  23. Here document in english wikipedia
  24. Kurs pracy w systemie Linux (pracownia Michalisa
  25. Chapter 19. Here Documents
  26. stackoverflow : How can I write a here doc to a file in Bash script?
  27. Here Documents from ss64
  28. ReCode Project - Topographic Form animated by ClaudiusMaximus
  29. Archiwum grupy pl.comp.os.linux.programowanie : Bash : kopiowanie wybranych plików z podkatalogami
  30. [http://ubuntu.pl/forum/viewtopic.php?f=170&t=160739%7Cpoprawne wywołanie rsync w bash w forum ubuntu.pl
  31. Bash String Examples from HackTux
  32. [http://stackoverflow.com/questions/9506584/convert-scientific-notation-bash-script Stackoverflow : convert scientific notation bash script ]
  33. [http://www.cyberciti.biz/faq/ksh-csh-shell-assign-store-printf-result-variable/ Linux / Unix: Bash Shell Assign Printf Result To Variable by NIXCRAFT ]
  34. 16 commands to check hardware information on Linux By Silver Moon On Apr 8, 2014
  35. Hardware Lister (lshw) - home page
  36. unix.stackexchange question : how-to-list-disk-in-linux