Známé:
Bourne shell:
Původní Thompson shell /bin/sh. V roce 1979 nový Bourne shell se stejným názvem /bin/sh (autor Stephen Bourne)
Co je shell?
Interpretačiní programovací jazyk. Čte příkazy z terminálu nebo ze souboru a provádí je.
Obecný formát příkazového řádku:
arg0 arg1 arg2 ...
Řetězec arg0 je vždy jméno příkazu.
Příkazy
arg0 se nejprve hledá v seznamu vnitřních příkazů a potom podle seznamu cest proměnné PATHUkončovací kód (exit status):
Každý příkaz při svém ukonření vrací numerický stav.
Hodnota 0 znamená OK.
Nenulová hodnota značí chybu.
echo $?
Bílá místa == oddělovač argumentů (nezáleží na počtu.)
; == oddělovač příkazů.
\ (backslah):
\ ztrácí svůj řídící charakter a stává se obyčejným znakem.\ na konci řádku sděluje, že další řádek je pokračováním tohot.'...', ztratí všechny řídící charakter."..." ztrácejí znaky svůj řídící význam kromě:
$ (dolar)příkaz n> souborpříkaz n< soubor0 - standardní vstup1 - standardní výstup2 - standardní chybový výstup1> je totéž jako >0< je tottéž jako <příkaz n< soubor - Soubor nemusí existovatpříkaz > soubor
set -C (nebo export noclobber=), potom nelze přesměrovat výstup do existujícího souboru. Toto omezení odstraní operátor >|. (cesta do pekel, jsme tam kde jsme byly)ls > a > b
a zůstane prázdný, soubor b se naplní stdout. Problém lze řešit např.: ls|tee a > bpříkaz n>> soubor
příkaz n<<ukončení
ukončení je symbol konce vstupu (řetězec označující konec vstupu)n<<ukončení musí být bez mezer. (zpracuje se jako by byl v "..")mail novak <<EOF
První řádek dopisu
Druhý řádek dopisu
EOF
- Ve variantě `n<<-ukončení` se vypouštějí všechny znaky TAB na začátku čtených řádků.
mail novak <<-EOF
První řádek dopisu
Druhý řádek dopisu
EOF
n>&mls neni ji > dirlist 2>&1 - Deskriptor 1 se přiřadí soubor dirlist a deskriptor 2 se přiřadí k 1.n ani m uvedeno, potom >& slouží jako operátor přesměrování std out a stderr do souboruls neni je >& vseecho Chyba >&2příkaz1 | příkaz2 [ | příkaz 3 ...]
| propojucí stdout příkazu1 se stdin příkazu2 rourou! příkaz1 | příkaz2 [ | příkaz 3 ...] se ukončovací kód kolony neguje
prikaz1 & [prikaz2 & ...]/dev/null.&), vypíše se identifikace:ping aisa > /dev/null &
[1] 1234
susp. Shell pošle procesu signál STOP a vypíše se:ping aisa > /dev/null
^Z
[2]+ Stopped pring aisa > /dev/null
jobs - vypíše seznam řízených úloh[1]- Running ping aisa > /dev/null &
[2]+ Stopped ping aisa > /dev/null
- `+` znamená current job, `-` znamená previous job
- Na úlohu se zle odkazovat několika způsoby
- `%+` nebo `%%`
fg [job]
bg [job]
; nebo ampersandem &&), ihned se zahájí provádění následujícího.&& - provede se další příkaz pouze pokud návratová hodnota předchozího procesu byla 0|| - provede se další příkaz pouze pokud návratová hodnota předchozího procesu byla různá od nuly`příkaz`$(příkaz) - (je preferovaný způsob, více vnořování)stdin příkazu nadním.jméno=[hodnota]*, viz dále)$jméno${jméno}setunset proměnná ...export proměnná ... - umožňuje proměnnou exportovat do potomkůread proměnná ... - Příkaz čte ze std in slova a aplikuje expanziHOME - Domovský adresář pro příkaz “cd bez parametru” apod.PWD - Běžný (pracovní) adresář; pwd (echo $PWD)OLDPWD - Předchozí adresář; cd -MAIL - Jméno souboru s poštovní schránkou uživatele.PATH - Seznam adresářů prohledávaných při spuštění souboru.MANPATH - Senzam adresářů prohledávaných příkazem man.PS1 - Řetězec primárního promptuPS2 - Řetězec sekundárního promptu (implicitně >), tj. prompt pokračování řádků.IFS - Internal Field Separator - oddělovače polí v příkazu. Proměnná normálně obsahuje: mezeru, tabulátor, nový řádek.(seznam)
seznam se provede ve vnořeném shellu.() - jsou znaky s řídícím významem{ seznam;}
seznam se provede v aktuálním shellu.{} - nejsou znaky s řídícím významemfor jméno [ in slovo; ] do seznam; done
jméno a provádí posloupnost příkazů seznam.in slovo; zadáno, potom se seznam provede pro každý poziční parametr.case slovo in
vzorek [| vzorek ...]) seznam;;
...
esac
if seznam; then seznam; [elif seznam; then seznam; ] ...
[else seznam;] fi
if seznam;. Pokud jeho návratový kód je nulový (OK), provede se then seznam;. Jinak se provede elif seznam; (…) nebo else seznam;.0, pokud se neprovedl žádný příkaz.while seznam; do seznam; done
until seznam; do seznam; done
do seznam; se provádí tak dlouho, dokud je návratový kód
while seznam; nulovýuntil seznam; nenulovýbreak [n]
for, while, until.continue [n]
true
0.false
1.test výraz
[ výraz ]
0 (true) nebo 1 (false).-b soubor - soubor existuje a je blokovým speciálním souborem..-c soubor-f soubor - soubor existuje a je normálním souborem.-x soubor - soubor existuje a je spustitelný-e soubor - soubor existuje.-s soubor - soubor existuje a má větší velikost než nula.soubor1 -nt soubor2 - soubor1 je novější (podle času poslední modifikace) než soubor2-z řetězec - Délka řetězce je nulová-n řetězec - Délka řetězce je nenulová.řetězec1 = řetězec2 - Řetězce jsou shodné.řetězec1 != řetězec2 - Řetězce nejsou shodné.[ číslo1 -eq číslo2 ] # číslo1 = číslo2
[ číslo1 -ne číslo2 ] # číslo1 ≠ číslo2
[ číslo1 -lt číslo2 ] # číslo1 < číslo2
[ číslo1 -le číslo2 ] # číslo1 ≤ číslo2
[ číslo1 -gt číslo2 ] # číslo1 > číslo2
[ číslo1 -ge číslo2 ] # číslo1 ≥ číslo2
! výraz - výraz je nepravdivý.výraz1 -a výraz2 - výraz1 a výraz2 jsou pravdivé.výraz1 -o výraz2 - výraz1 nebo výraz2 je pravdivý.(); nesmíme však zapomenout závorky odstínit od shellovských expanzí např. \( \)skript lze číst:
r.bash skript (Soubor skript hledá v běžném adresáři a $PATH). skript (Soubor skript se hledá v $PATH a v běžném adresáři.)skript lze číst a provést:
rx.skript. (Soubor skript se hledá v $PATH)#!/bin/sh
r).# (znak je buď na začátku řádku, nebo jej bezprostředně předchází bílé místo).$1 $2 $3 ... $9
${1} ${2} ... ${9} ${10} ${11} ...
set -- a b c
echo $1 $2 $3
shift [n] - Příkaz “posune” obsahy pozičních parametrů o n nebo jeden doleva. Počet pozičních parametrů $# se sníží o jeden.$* - Expanduje se do pozičních parametrů od prvního do posledního zadaného. Je-li parametr uveden uvnitř dvojice úvozovek, expanduje se do jednoho slova tak, že se parametry oddělí prvním znakem uvedeným v IFS (nebo mezerou, není-li IFS).$# - Expanduje se do počtu pozičních parametrů.$? - Expanduje se do návratového kódu posledního dokončeného procesu.$- - Expanduje se do řetězce znaků zadaných jako volby.$$ - Expanduje se do čísla procesu shellu, který provádí expanzi (typický příklad na vytvoření pomocného souboru jedinečného jména).$! - Expanduje se do čísla nejposlednějšího procesu spuštěného na pozadí.$0 - Expanduje se do uživatelem zadaného jména skriptu.${proměnná} - nejjednodušší tvar${proměnná:-slovo}
proměnná nedefinovaná nebo prázdná, použije se expadnované slovo.${proměnná:=slovo}
proměnná nadefinována nebo prázdná, přiřadí se a použije se expandované slovo.${proměnná:?slovo}
slovo.${proměnná:+slovo}
slovo.${#proměnná} - Délka řetězce proměnné ve znacích.${proměnná%suffix} - nejkratší${proměnná%%suffix} - nejdelší${proměnná#prefix} -~novak - Domovský adresář uživatele novak (např. /home/novak)~ - Domovský adresář běžného uživatele (podle $HOME)~/.profile - Vždy se vykoná po spuštění~+ - Běžný adresář (podle $PWD)~- - Předchozí běžný adresář (podle $OLDPWD)* - Vyhovuje libovolnému počtu znaků
. - nutno zadat explicitně .*? - Vyhovuje jednomu libovolnému znaku.[] - Definuje třídu vyhovujících znaků; obsah hranatých závorek popisuje právě jeden znak
[ACd-i]* - vyhovuje jménům začínajícím znakem A,C,d,e,…,i.[!0-9]* - Vyhovuje jménům, které nezačínají číslicí.jmeno() { seznam;}jmeno [argumenty]local promenna[=...]$0).return [návratový kód]
$((výraz))$[výraz]$..) a substituce příkazů \…``() pro změnění priority0n - osmičková soustava0xn - šestnáctková soustavabáze#n - soustava, báze je 2 až 36---- nebudou argumenty brány jako volba