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

  1. 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''.
  2. 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''.
  3. 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`

Odkazy