Toto je starší verze dokumentu!
Metaznaky shellu
Úvod
Shell je základní program, pomocí kterého v textovém režimu komunikuje uživatel s počítačem. První, co si každý vyzkouší je, že se pomocí něj dají spouštět programy (textové - např. editor nano
i grafické (například firefox
). Shell toho ale umí mnohem víc.
Mimochodem:
Samotných shellů existuje více. Klasický shell se jmenuje Bourne shell, a jeho binárka je /bin/sh
. Větší uživatelský komfort nabízí BASH(Bourne again shell) - /bin/bash
, který je se sh
zpětně kompatibilní. Pak jsou také další shelly - například csh
, jehož syntaxe se více podobá programovacímu jazyku C.
Shell je plnohodnotný programovací jazyk - má proměnné, i klasické řídící příkazy (if-else, for, while). Oproti většině klasických jazyků (C,C#,Java) se ovšem nekompiluje, ale interpretuje - proto se mu občas říká skriptovací.
Většinou používáme shell ke spouštění příkazů a programů. Přičemž se na první pohled nepozná rozdíl mezi interním příkazem shellu (echo, cd, read, pwd, let, eval, set, exit, true) a externím programem (jenž je uložen v jedné ze složek v systémové $PATH, kupříkladu v /usr/bin … příkladem je cut
,sort
,nano
,tr
…)
Proces vykonávání
Co ale shell udělá, když mu napíšete něco jako:
cut -f: -n3
- Koukne se do proměnné $IFS. Ta je defaultně nastavená na bílý znak (mezeru).
IFS
znamená Internal Field Separator - vnitřní oddělovač polí. Tímto znakem se pak zadaný příkaz rozřeže. - První neprázdná položka se bere jako příkaz (může jít i o program s cestou). Shell spustí tento příkaz/program … a nasype mu jako parametry další položky. V tomto příkladu tedy dostane program cut (který se nachází na disku jako binárka /usr/bin/cut) parametry
-f:
a-n3
. - Po ukončení programu shell znovu zobrazí příkazovou řádku. Ta může vypadat asi takhle:
uzivatel@pocitac:~$
Ukončení programů:
Některé programy se ukončí samy poté, co provedou výpočet a zobrazí výstup. Některé ale ne. Většinou čekají na nějaký uživatelský vstup, nebo jsou svou podstatou nekonečné (yes
, ping
). Neexistuje ustálený způsob, jak je zavřít. První pokus by měl být 'Ctrl+D
'. To shellu zpravidla předá znak označující konec vstupu. Nezabere-li to, 'Ctrl+C
' - vyšle běžícímu programu signál SIGINT (signál přerušení). Některé složitější programy však mají vlastní způsob vypínání. Většina (třeba nano
se uzavírá ctrl+x) to alespoň ukáže v nějakém menu. Textové editory/zobrazovače se uzavírají napsáním :q
a odentrováním. Takhle zavřete zapeklitý textový editor vi
, a také man
,less
,more
.
Metaznaky
Metaznaky jsou znaky na vstupu se speciálním významem.
Znak | Co dělá | Příklad |
---|---|---|
$ | Uvozuje proměnnou při jejím vypisování. | |
[mezera] | Oddělovač parametrů | |
* | Ve jménech souborů - rozvíjení všech možností jakéhokoliv počtu znaků | cp *.jpg /mnt/disk/obrazky/ |
? | Ve jménech souborů - rozvíjení všech možností jednoho znaku | rm ABC_??.jpg |
[konec řádky (enter)] a ; | Oddělovač jednotlivých příkazů | |
(> a < ) | Přesměrování do/ze souboru | echo ahoj > denik.txt ; echo neco_dalsiho >> denik.txt |
| (Pípa) | Přesměrování výstupu do dalšího příkazu | echo test| cat |
& | Vykonání příkazu na pozadí | ps & |
&& | řetězení příkazů; druhý příkaz se vykoná pouze pokud první uspěje | test -e file && exit |
` [zpětný apostrof] | Oblast ohraničenou dvěma apostrofy shell nejprve vykoná jako příkaz, a případný výstup doplní do daného místa | echo `cat soubor` |
metaznaky pro ignorování metaznaků:
Znak | Co dělá | Příklad |
---|---|---|
\ | Ignoruj význam následujícího znaku | echo \* |
„ | V úvozovkách se ingorují metaznaky krom $, \, `` | echo „retezec s mezerami“ |
\ ' | V apostrofech se ignorují všechny metaznaky | echo 'test „doslovneho“ retezce ***' |
Příklady
# Každý z řádků vytiskne zpětné lomítko echo \\ echo '\'
#Teď je 19:05 echo "Teď je `date +%H:%M`" #Prakticky stejné jako cat * cat `ls`