Linux: Kniha kouzel, vanilková příchuť 2.14 (15. července 2022)
Veškerá moc příkazové řádky/příkazového řádku přehledně, pro začátečníky i pokročilé

2. Základní znalosti

Řada 2.x vanilkové příchuti Linuxu: Knihy kouzel je od 15. července 2022 do 1. března 2025 ve stavu dlouhodobé pasivní údržby; nahlášené chyby budou opravovány, ale aktivní vývoj se již věnuje jiným projektům. Máte-li zájem pokračovat v tvorbě Linuxu: Knihy kouzel pro novější verze linuxových operačních systémů, kontaktujte autora nebo rovnou vytvořte odnož.

1. Úvod

Tato kapitola uvádí základní znalosti, které každý středně pokročilý uživatel Bashe (což je nejčastější a v Ubuntu výchozí interpret příkazové řádky) dobře zná a často používá. Jejich znalost se vám může velmi vyplatit při přizpůsobování zaklínadel vašim potřebám, takže vám doporučuji si tuto krátkou kapitolu projít.

2. Vstupy, výstupy a přesměrování

Aby se terminálové příkazy v Linuxu daly snáze propojovat, nabízejí jednotné rozhraní svých vstupů a výstupů; každý takový příkaz má standardní vstup (ze kterého může číst), standardní výstup (kam může zapisovat) a standardní chybový výstup (kam obvykle vypisuje chybová hlášení, aby se nemíchaly s normálními daty).

Všechny tyto vstupy a výstupy jsou ve výchozím stavu napojeny na terminál, ale můžete je přesměrovat ze/do souboru:

příkaz [parametr] [<soubor-pro-std-vstup] [>soubor-pro-std-výstup] [2>soubor-pro-std-chyb-výstup]

Roura je nástroj, který umožňuje připojit standardní výstup jednoho příkazu na standardní vstup druhého; příkazy pak běží současně a předávájí si tímto kanálem data. Roura vypadá takto:

první-příkaz | druhý-příkaz [| další-příkaz]

3. Minus místo názvu souboru

Řada příkazů po vás vyžaduje zadat název souboru, ze kterého budou číst nebo kam budou zapisovat. Mnoho těchto příkazů vám dovoluje na místo názvu souboru zadat „-“ a program pak přečte data ze svého standardního vstupu, který může přicházet přes rouru z jiného programu. Jako příklad mohu uvést příkaz „cat“:

printf 'první řádek\ndruhá řádka\n' | cat prvni-soubor.txt - druhy-soubor.txt

Ne všechny příkazy to umožňují. Budete-li na pochybách, budete to muset vyzkoušet nebo hledat v jejich nápovědě. V případě, že budete potřebovat takovému příkazu skutečně zadat, aby pracoval se souborem, který se jmenuje „-“, je potřeba ho zadat jako „./-“.

4. Oddělovač --

Když budete potřebovat předat příkazu argument začínající znakem minus (např. název souboru nebo formátovací řetězec printf), může být příkaz zmatený a omylem považovat daný parametr za přepínací volbu. Např. každý z těchto příkazů skončí s chybou:

printf '-a%s\n' test.c
rm -v

Většina příkazů umožňuje tuto situaci vyřešit tím, že za poslední volbu uvedete zvláštní parametr „--“, který znamená, že za ním už následují jen argumenty a žádné volby:

printf -- '-a%s\n' test.c
rm -- -v

Druhý příkaz sice stále selže, protože nemáte soubor „-v“, ale už mu bude jasné, co po něm chcete.

Úplně všechny příkazy tuto možnost nenabízejí; jste-li na pochybách, vyzkoušejte to nebo nahlédněte do jejich nápovědy.

5. Kde najít nápovědu

Když už jsme u té nápovědy — pokud objevíte nějaký příkaz a zajímá vás, co dělá, jak se používá a jaké přijímá volby, zapomeňte na internet! Online zdroje, které na něm můžete nalézt, jsou sice užitečné jako tutorialy a můžete se z nich naučit mnoho jednoduchých technik, ale bývají (až na výjimky) buď zastaralé, nebo naopak příliš nové (a tedy nabízejí i možnosti, které verze příkazu ve vašem systému nemá). Pokud hledáte konkrétní nápovědu a ne obecný tutorial, zkuste nejprve následující standardní postup, jak se k nápovědě dostat:

 

1. Pokud jde o interní příkaz Bashe, zadáním příkazu „help příkaz“ se dostanete ke stručné nápovědě. Nejste-li si jistý/á, zda jde o interní příkaz Bashe, napište do terminálu „builtin“ a dvakrát stiskněte klávesu Tab; vypíše se seznam interních příkazů Bashe. Tentýž seznam můžete získat příkazem „compgen -A builtin“.

2. Pokud nejde o interní příkaz Bashe, zkuste ho zavolat s parametrem „--help“, případně „-h“. Mnoho příkazů v takovém případě vypíše krátkou nápovědu a poradí, kde sehnat podrobnější; některé (např. „youtube-dl“) rovnou vypíšou tu podrobnější.

3. Podrobnější nápovědu k mnoha příkazům získáte příkazem „man příkaz“. Manuálové stránky mají jednotnou strukturu, takže se v nich uživatel brzy naučí orientovat, jen málo z nich je ale přeložených do češtiny.

4. Poslední obvyklou možností je příkaz „info příkaz“. Ten je potřeba poměrně zřídka; v praxi jsem ho potřeboval/a pouze u příkazu „date“.

 

V krajním případě se můžete vydat prozkoumat adresář „/usr/share/doc/příkaz“, pokud existuje, ale informace tam bývají obvykle vhodné jen pro nejpokročilejší uživatele a často nejsou dostupné, pokud si nenainstalujete příslušný dokumentační balíček.

Teprve pokud uvedené postupy selžou nebo neposkytnou dostatečně podrobné informace, hledejte oficiální stránku daného programu nebo jiný dostatečně věrohodný online zdroj. Online zdroje vám také mohou pomoci v případě, kdy potřebujete funkci, která ve verzi příkazu dostupné ve vašem systému, není podporovaná. V takovém případě vám mohou poradit, jakou verzi potřebujete a jak ji do vašeho systému nainstalovat.

6. Odzvláštňování

Když v terminálu zadáte příkaz, interpret Bash ho přečte znak po znaku od začátku do konce a ke každému znaku přiřadí příznak, zda s ním bude zacházat jako s „obyčejným znakem“ nebo mu přisoudí nějaký zvláštní význam. Jako příklad uvedu příkaz:

cat a.txt

V uvedeném příkazu jsou všechny znaky obyčejné, s výjimkou mezery – ta má zvláštní význam: odděluje příkaz od jeho parametru. V Bashi mají obvykle zvláštní význam tyto znaky:

Konec řádku, mezera, " # $ & ' ( ) * ; < > ? [ \ ] ` { | } ~

Znak „!“ má zvláštní význam jen tehdy, když po něm nenásleduje mezera, konec řádku nebo ukončující dvojitá uvozovka; ve skriptech je pak obyčejný vždy.

Znaky „^“„=“ mají zvláštní význam převážně jen v místě, kde se očekává název příkazu (tam se pak interpretují jako přiřazení do proměnné nebo rozvoj z historie); v ostatních místech s nimi lze zacházet jako s obyčejnými znaky.

Naopak tyto znaky jsou v Bashi v normálním kontextu vždy obyčejné:

% + , - . / : @ _

Někdy ale potřebujete, aby se znak, kterému Bash připisuje zvláštní význam, zpracoval stejně jako obyčejné znaky. Nejčastěji tehdy, když název souboru obsahuje mezeru a chcete, aby Bash dokázal rozlišit mezeru oddělující příkaz od názvu souboru od mezery, která do názvu souboru přímo patří. Uvedu příklad:

cat Ahoj, světe.txt

Aby příkaz „cat“ nehledal dva různé soubory „Ahoj,“ a „světe.txt“, musíte sdělit Bashi, že s mezerou mezi nimi má nakládat jako s obyčejným znakem, musíte ji tedy odzvláštnit. Na to existují čtyři metody:

cat Ahoj,\ světe.txt
cat 'Ahoj, světe.txt'
cat "Ahoj, světe.txt"
cat $'Ahoj, světe.txt'

Základní (ačkoliv ne nejpoužívanější) metodou odzvláštnění je umístění zpětného lomítka před zvláštní znak. Tato metoda funguje se všemi zvláštními znaky kromě konce řádky – ten se v takovém případě z příkazu úplně vypustí.

Často používaná je druhá metoda – uzavření do apostrofů. Když Bash narazí při čtení příkazu na apostrof, přepne se do kontextu, ve kterém považuje za zvláštní znak jen další apostrof a všechny ostatní znaky bez výjimky (tzn. včetně konce řádku či zpětného lomítka) považuje za znaky obyčejné. Pokud do takto odzvláštněného parametru potřebujeme vložit apostrof, musíme ho nahradit konstrukcí:

'\''

Uzavření do dvojitých uvozovek je určitý kompromis. Uvnitř nich zůstává zvláštní význam pouze znakům „!“ (ne ve skriptech), „"“, „$“, „\“ a „`“ a tyto znaky (kromě vykřičníku) lze i uvnitř dvojitých uvozovek odzvláštnit zpětným lomítkem. Obzvlášť často se dvojité uvozovky používají v kombinaci s dosazováním proměnných.

Poslední metodou jsou apostrofy s dolarem. Uvnitř nich zůstává zvláštní význam pouze znakům „'“ a „\“, přičemž oba lze odzvláštnit zpětným lomítkem a zpětné lomítko zde navíc umožňuje zadat širokou škálu zvláštních sekvencí, které se přeloží na řídicí či jiné znaky; např. „\n“ se zde přeloží na konec řádky a „\u2251“ zde vygeneruje znak Unicode s hexadecimálním kódem 0x2251.

6/1 Prázdný parametr

Mezery normálně oddělují od sebe parametry příkazu. Pokud použijete víc mezer za sebou, utvoří dohromady jen jeden oddělovač. Výjimkou je případ, kdy mezi mezery vložíte prázdnou konstrukci z apostrofů, uvozovek či apostrofů s dolarem. V takovém případě Bash každou takovou konstrukci interpretuje jako jeden další (prázdný) parametr, bez ohledu na to, jak je složitá. Příklady:

printf '(%s)\n' A    B⊨ 2 řádky
printf '(%s)\n' A  ""  B⊨ 3 řádky
printf '(%s)\n' A  ''""  B⊨ 3 řádky
printf '(%s)\n' A  ""''$''  B⊨ 3 řádky
printf '(%s)\n' A  "" $''  B⊨ 4 řádky

7. Návratový kód a zřetězení

Každý příkaz, když skončí, vrací číselný kód (0 až 255), který značí, zda vykonání příkazu proběhlo v pořádku nebo selhalo. Tento kód se v Bashi ukládá do zvláštní proměnné „$?“, odkud ho můžete vypsat např. příkazem „echo $?“, ale všem uživatelům důrazně doporučuji si jeho výpis přidat do výzvy terminálu (viz kapitolu Terminál); některé příkazy (např. „test“, „false“ či „laptop-detect“) totiž normálně nevypisují žádné výsledky ani chybová hlášení a návratový kód je pak jedinou zprávou o jejich činnosti. To, že ho výchozí výzva ponechává skrytý, považuji za značný nedostatek.

Návratový kód 0 znamená, že příkaz uspěl; jiná hodnota (1 až 255), že selhal.

Je-li příkazem několik příkazů spojených rourami, návratovým kódem je kód posledního uvedeného. (Návratové kódy všech částí roury lze získat z pole „PIPESTATUS“, ale obvykle to není potřeba.)

Návratový kód umožňuje zřetězit samostatné příkazy a rourami spojené sestavy příkazů pomocí logických operátorů && („a“) a || („nebo“):

  • && — Příkaz napravo se provede jen tehdy, když to, co je od operátoru nalevo, skončí úspěchem (tzn. s návratovým kódem 0). V opačném případě se příkaz napravo od tohoto operátoru tiše přeskočí a návratová hodnota zůstane nezměněná.
  • || — Totéž, ale příkaz napravo se přeskočí, pokud část vlevo selže (tzn. návratová hodnota bude nenulová).

Příklad („false“ je příkaz, který vždy selže):

echo a || false && echo b && false | wc -c && echo c || echo d || false; echo $?
  • Nejprve se vypíše „a“ (návratový kód 0).
  • Operátor „||“ a kód je 0, takže se příkaz „false“ přeskočí a kód se nezmění.
  • Operátor „&&“ a kód je 0, takže se vypíše „b“ (kód 0).
  • Pak se provede příkaz „false“ (kód 1), ale je rourou spojený s „wc -c“ (kód 0). U roury zůstává návratový kód posledního příkazu, takže „wc -c“ vypíše nulu a výsledný kód bude opět 0.
  • Operátor „&&“ a kód je 0, takže se vypíše ještě „c“ (kód 0).
  • Operátor „||“ a kód je 0, takže příkaz „echo d“ se přeskočí a kód se nezmění.
  • Operátor „||“ a kód je 0, takže příkaz „false“ se přeskočí a kód se nezmění.
  • Příkaz „echo $?“ za středníkem se vykoná bez ohledu na poslední návratový kód a vypíše „0“ (kód 0).
Líbí se vám tento projekt a chcete, aby byl ještě lepší? Můžete mi s tím pomoci. Zmiňte se o něm technicky zdatným přátelům, opravte překlepy a nahlašte nefunkční zaklínadla, aby mohla být opravena; poskytněte mi zpětnou vazbu nebo se zapojte do vývoje nových kapitol. Další informace na GitHubu v dokumentu Jak se zapojit.
[BY-SA]

Veškerý obsah této stránky (text, obrázky, zdrojový kód) je možno upravovat a šířit pod podmínkami licence Creative Commons Attribution-ShareAlike 4.0 International. Upozorňuji, že uvedená licence vyžaduje uvedení seznamu autorů, licence a zdroje a poskytnutí stejné či kompatibilní licence k provedeným změnám, jsou-li nějaké. Příslušné údaje jsou dostupné na stránce „Přehled autorů“. Šíření obsahu bez těchto údajů nebo šíření upravené verze bez poskytnutí adekvátní licence k provedeným úpravám je pravděpodobně porušení licenčních podmínek a může být postihováno. Poskytování zdrojového kódu při šíření není touto licencí vyžadováno.

Pro nové verze, další informace, aktuální zdrojový kód a možnost se zapojit do projektu „Linux: Kniha kouzel“ navštivte jeho repozitář na GitHubu.