bash

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

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

Sprawdzanie skrypttu[edytuj]

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 : [5]

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

Opcje[edytuj]

Opcje Basha [6].

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

   #!/bin/bash -x


Zmienne środowiskowe[edytuj]

Opis [7][8]

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 :[9]

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



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 czasowo wartość zmiennej PATH :

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

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

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 [17]) :
#!/bin/bash
  • 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 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.


Heredoc[edytuj]

Opis[18]:

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

Składnia : [20]

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


Przykłady : [21]

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

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

Języki skryptowe[edytuj]

  • sed
  • awk

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]

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 :[23]


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ć : [24][25]

  • 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]

Łata ( ang. patch)[26] jest to plik zawierający różnice między 2 plikami


Tekst[edytuj]

Mamy 2 pliki tekstowe old.txt i new.txt. Różnice między nimi znajdziemy za pomocą programu diff :[27]

diff -a old.txt new.txt >r.txt

Wynik będzie zapisany do pliku tekstowego r.txt za pomocą potoku

kod źródłowy[edytuj]

Łata jest plik zawierający różnicę pomiędzy nowym i starym plikiem. Tworzymy ją za pomocą komendy :

diff -u oryginalny.c nowy.c > oryginalny.patch


Dokumentacja[edytuj]

Dokumentacja offline :[28]

man diff


lub

diff --help.


Strony manuala ( man) zamykamy Ctrl-c

Ł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 [29]

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, perl, python ...


Konwersja postaci naukowej do zmiennoprzecinkowej[edytuj]

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

 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 : [31]

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

System[edytuj]

Informacje o procesorze :

cat /proc/cpuinfo

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. | spellcheck
  5. What is the CVE-2014-6271 bash vulnerability, and how do I fix it?
  6. Bash options
  7. Zmienna środowiskowa w wikipedii
  8. Environment Variables
  9. : env
  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. Shebang w wikipedii
  18. Here document in english wikipedia
  19. Kurs pracy w systemie Linux (pracownia Michalisa
  20. Chapter 19. Here Documents
  21. stackoverflow : How can I write a here doc to a file in Bash script?
  22. Here Documents from ss64
  23. ReCode Project - Topographic Form animated by ClaudiusMaximus
  24. Archiwum grupy pl.comp.os.linux.programowanie : Bash : kopiowanie wybranych plików z podkatalogami
  25. [http://ubuntu.pl/forum/viewtopic.php?f=170&t=160739%7Cpoprawne wywołanie rsync w bash w forum ubuntu.pl
  26. 10 minut z diff i patch - Bartłomiej Piotrowski
  27. Comparing and Merging Files - GNU doc
  28. Manual diff online
  29. Bash String Examples from HackTux
  30. [http://stackoverflow.com/questions/9506584/convert-scientific-notation-bash-script Stackoverflow : convert scientific notation bash script ]
  31. [http://www.cyberciti.biz/faq/ksh-csh-shell-assign-store-printf-result-variable/ Linux / Unix: Bash Shell Assign Printf Result To Variable by NIXCRAFT ]