Pojďme se podívat na to, co přesně Bash dělá, když spustí program.
Příkaz ps
bez argumentů vypíše jen ty procesy, které „patří“ k aktuálnímu
terminálu:
$ ps
PID TTY TIME CMD
2328 pts/0 00:00:00 bash
14509 pts/0 00:00:00 ps
Vidíš, že běží dva programy: jak bash
tak ps
.
Co když přesměruješ data z jednoho příkazu do druhého?
$ ps | cat
PID TTY TIME CMD
2328 pts/0 00:00:00 bash
14661 pts/0 00:00:00 ps
14662 pts/0 00:00:00 cat
$ ps | cat | sort
PID TTY TIME CMD
14679 pts/0 00:00:00 ps
14680 pts/0 00:00:00 cat
14681 pts/0 00:00:00 sort
2328 pts/0 00:00:00 bash
$ echo | ps
PID TTY TIME CMD
2328 pts/0 00:00:00 bash
14689 pts/0 00:00:00 ps
Když Bash spouští program, udělá tři věci:
Pokud Bash spouští několik programů najednou, udělá obecně každý z těchto kroků pro všechny spouštěné programy najednou.
Příklady:
ps
ps
.ps
ukončí.
(Program ps
mezitím něco vypíše na std. výstup.)Po ukončení Bash vypíše výzvu a čeká na další příkaz.
ps | cat
ps
a std. vstup pro cat
přesměruje na tuto rouru.
(Zbylé – std. chyby, vstup pr ps
i výstup z cat
– nechá jako u Bashe.)ps
i cat
.Čeká, než se ps
i cat
ukončí.
(Programy mezitím spolu komunikují nebo píší na std. výstup.)
ps | cat | sort
Příkazů propojených rourami může být více; Bash skládá za sebe stejným spůsobem.
echo | ps
Z pohledu Bashe je echo | ps
úplně stejné jako ps | cat
.
Příkaz echo
se ale ukončí hned poté co vypíše svůj řádek, což je většinou
velice rychlé – stihne to dřív než se ps
zeptá systému na běžící programy.
Proto echo
většinou není ve výstupu vidět.:
$ echo | ps
PID TTY TIME CMD
2328 pts/0 00:00:00 bash
14689 pts/0 00:00:00 ps
Kromě |
se příkazy dají kombinovat několika dalšími operátory.
Nejjednodušší je středník (;
): napřed se provede příkaz na levé straně,
potom ten na pravé.
$ echo 'Vysledek je'; python -c 'print(1 + 1)'
Vysledek je
2
Docela užitečné je &&
(logické A; angl. AND): napřed se provede příkaz
na levé straně, a pouze pokud uspěl ($?
je 0), se provede ten na pravé.
$ python -c 'print(1 + )' && echo 'je výsledek'
File "<string>", line 1
print(1 + )
^
SyntaxError: invalid syntax
Tenhle operátor se hodí např. v případech, kdy píšeš program, který připraví
nějaký soubor. Příkaz python priprav-soubor.py && head pripraveny-soubor.dat
vypíše ukázku výsledku, ale jen když se všechno povedlo.
Když Python skončí s chybou, pripraveny-soubor.dat
(existující od minula)
se nevypíše – na obrazovce zůstane chybová hláška od Pythonu.
Opak je ||
(logické NEBO; angl. OR): příkaz na pravé straně se provede,
pokud příkaz nalevo neuspěl ($?
není 0).
$ python -c 'print(1 + )' || echo 'Jejda! Chyba!'
File "<string>", line 1
print(1 + )
^
SyntaxError: invalid syntax
Jejda! Chyba!
A nakonec, když dáš za příkaz &
, tak Bash nebude čekat na konec programu,
ale pokračuje hned dál.
Když program skončí, dá Bash před dalším promptem vědět:
$ sleep 1
$ sleep 1 &
[1] 25507
$
$ # vteřinu počkej...
[1]+ Dokončena sleep 1
$
Pozor na to, že program „v pozadí“ sdílí s Bashem terminál, takže pokud bude něco psát (nebo hůř, číst) se std. vstupu/výstupů, bude se s Bashem „hádat“.
$ curl https://httpbin.org/get &
[1] 25537
$ { ... sem curl vypíše jakási stažená JSON data ... }