bash
Spis treści
Wstęp[edytuj]
Dokumentacja[edytuj]
Za pomocą polecenia:[1]
man bash
uzyskamy wersję dokumentacji:
- aktualną (odpowiednią 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 flagi "-x" pozwala zobaczyć co dokładnie skrypt robi:
#!/bin/bash -x
Zmienne środowiskowe[edytuj]
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 odnośnik 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ą polecenia:[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"
LIBRARY_PATH[edytuj]
LIBRARY_PATH
jest sprawdzana w czasie kompilacji (linkowania)
PATH[edytuj]
Ścieżka dostępu do plików wykonywalnych = PATH
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.
Klasa użytkowników | plik |
---|---|
aktualny | $HOME/.bash_profile |
wszyscy oprócz su | /etc/profile |
su (root) | /root/.bash_profile |
LD_LIBRARY_PATH[edytuj]
- Ścieżka dostępu do bibliotek skompilowanych [17]
- jest sprawdzana w czasie wykonywania programu.
- jest to lista katalogów rozdzielonych dwukropkiem (ang. colon) podobnie jak PATH
- katalogi zawierają prawidłowo skompilowane i zlinkowane biblioteki
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 polecenia skryptu.
Lokalizacja skryptu[edytuj]
Skrypt może być:
- w dowolnym katalogu,
- uruchamiany z tego katalogu ./nazwa
- w katalogu ~/bin/ [20]
Sprawdzanie skryptu[edytuj]
Heredoc[edytuj]
Opis[23]:
- kilka poleceń zostanie wykonanych, a treść ich 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) |
Wejście i wyjście[edytuj]
Przykład:
./pseudo-de <mandel.kfb >pde.pgm
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 polecenia 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ć polecenia:
- move
- BASH/rename (wykorzystuje wyrażenia regularne Perla)
- cut
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]
- 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]
- porównywanie plików, różnice (ang. diff)
- łaty (ang. patch)
Ł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
albo gcc
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]
- awk lub gawk (gnu awk)
- bc
- dc
- du
- diff: różnice, łaty
- file
- grep
-
- ack - "lepszy niż grep"
-
- ls
- od
- sed
- ssh
- wc
Liczba dostępnych poleceń zainstalowanych przez użytkownika:
ls /usr/bin | wc -l
przykładowy wynik :
3239
inny katalog użytkownika:
ls /usr/local/bin | wc -l
przykładowy wynik :
7
Katalog poleceń systemowych :
ls /bin | wc -l
przykładowy wyni:
165
Szacuje się, że przecietny użytkownik pamieta około 30 poleceń [37]
Problemy[edytuj]
zły interpreter[edytuj]
bash: ./g.sh: /bin/bash^M: zły interpreter: Nie ma takiego pliku ani katalogu
lub w wersji angielskiej:[38]
bash: ./configure: /bin/sh^M: bad interpreter: No such file or directory
Błąd jest spowodowany złym znakiem końca linii[39]
Zobacz również[edytuj]
- code Obrazy i kod BASH użyty do ich tworzenia
- #!/bin/bash - programowanie w powłoce , kurs autorstwa Tomasza Gawędy
- Math Commands from Advanced Bash-Scripting Guide by Mendel Cooper - bc, dc i awk
- bash-hackers.org
- Dokumentacja Gentoo - bash
- Advanced Bash-Scripting Guide. An in-depth exploration of the art of shell scripting by Mendel Cooper
- explain shell
- shell check
- jokes: unix errors
Przypisy[edytuj]
- ↑ man - polecenie systemu Unix uruchomiane z wiersza poleceń powłoki systemowej
- ↑ | explainshell
- ↑ Powłoka systemu UNIX- dr inż. Edward Śliwa
- ↑ What is the CVE-2014-6271 bash vulnerability, and how do I fix it?
- ↑ Bash options
- ↑ Zmienna środowiskowa w wikipedii
- ↑ Environment Variables
- ↑ env
- ↑ [1]
- ↑ is in a number of the /etc/init.d/* scripts. What does LANG=C do and why do you need to set LANG=C.
- ↑ to change the bash shell language ?
- ↑ Locale w wikipedii
- ↑ doc 8.3. The locale
- ↑ - Linux man page
- ↑ [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” ]
- ↑ [Troubleshooters.Com and T.C Linux Library Present: Adding a Directory to the Path by Steve Litt]
- ↑ ubuntu environment Variables
- ↑ stackoverflow question: linux-error-while-loading-shared-libraries-cannot-open-shared-object-file-no-s
- ↑ Shebang w wikipedii
- ↑ The Beginner’s Guide to Shell Scripting: The Basics
- ↑ | spellcheck
- ↑ tldp - something goes wrong (debugging)
- ↑ Here document in english wikipedia
- ↑ Kurs pracy w systemie Linux (pracownia Michalisa
- ↑ Chapter 19. Here Documents
- ↑ stackoverflow: How can I write a here doc to a file in Bash script?
- ↑ Here Documents from ss64
- ↑ ReCode Project - Topographic Form animated by ClaudiusMaximus
- ↑ Archiwum grupy pl.comp.os.linux.programowanie: Bash: kopiowanie wybranych plików z podkatalogami
- ↑ [http://ubuntu.pl/forum/viewtopic.php?f=170&t=160739%7Cpoprawne wywołanie rsync w bash w forum ubuntu.pl
- ↑ Bash String Examples from HackTux
- ↑ [http://stackoverflow.com/questions/9506584/convert-scientific-notation-bash-script Stackoverflow: convert scientific notation bash script ]
- ↑ [http://www.cyberciti.biz/faq/ksh-csh-shell-assign-store-printf-result-variable/ Linux / Unix: Bash Shell Assign Printf Result To Variable by NIXCRAFT ]
- ↑ 16 commands to check hardware information on Linux By Silver Moon On Apr 8, 2014
- ↑ Hardware Lister (lshw) - home page
- ↑ unix.stackexchange question: how-to-list-disk-in-linux
- ↑ quora : Do-experienced-Linux-users-remember-all-the-commands
- ↑ stackoverflow question : configure-bin-shm-bad-interpreter
- ↑ webhostingtalk : skrypt-sh-problem/