Metaznaky shellu
Obecnosti
'''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 ''mozilla-firefox''). Shell toho ale umí mnohem, 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í''.
Tato vlastnost je v shellu využívána naplno - a tak se tu programování liší od klasického procedurálního přemýšlení. Právě proto jsme si zatím neukazovali podmínky (if-else), prostředky pro aritmetiku, atp. Spousta úloh jde totiž udělat elegantněji bez nich - jenom musíte mít otevřenou mysl.
Většinou používáme shell k ''volá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'' a ''spousta dalších''...)
'''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 je znak označující konec vstupu. Nezabere-li to, '''Ctrl+C''' - vyšle shellu příkaz na ukončení daného programu. 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. Velká rodina programů se uzavírá 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.
| '''$''' | 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ů. Např: *.jpg |
| '''?''' | Ve jménech souborů - rozvíjení všech možností jednoho znaku. Např: ABC_??.jpg |
| ''[konec řádky (enter)]'' a ''';''' | Oddělovač jednotlivých příkazů |
| > a < | Přesměrování do/ze souboru |
| | ''([Pípa])'' | Přesměrování výstupu do dalšího příkazu) |
| '''&''' | Vykonání příkazu na pozadí (''ps &''). Poslouží i pro řetězení příkazů (''test -e file && exit'' - druhý příkaz se vykoná pouze pokud první ''uspěje'') |
| '''`''' ''[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. Příklad: ''echo `cat soubor`'' |
A metaznaky pro ignorování metaznaků:
| \ | Ignoruj význam následujícího znaku. Například: ''echo *'' |
| '''"''' | V úvozovkách se ingorují metaznaky krom $, , `` |
| ''''''' | V apostrofech se ignorují všechny metaznaky |
Ještě pár příkladů
Příklady
#Každý tento řádek vytiskne zpětné lomítko
echo \
echo ''
Zpětné apostrofy
#Teď je 19:05
echo "Teď je `date +%H:%M`"
#Prakticky stejné jako cat *
cat `ls`