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?
Ve výstupu ps
uvidíš všechny spuštěné procesy:
$ 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
Všimni si, že v posledním příkladu chybí echo
.
Proč? I k tomu se dnes dostaneme.
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: napřed všem programům nastaví prostředí, potom teprve všechny spustí, a pak na všechny počká.
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 pro 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 spouštění 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é – zvládne to ještě dřív než se ps
stihne zeptat 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
Víš, proč se třeba man
nebo git diff
chovají a ovládají stejně jako less
?
Proto, že samy spustí less
a pošlou do něho rourou text,
který chtějí zobrazit.
Podobné programy většinou respektují proměnnou PAGER
,
kterou můžeš vybrat program, který se použije místo less
.
Zkus si more
, starší verzi less
která umí Enter,
Mezerník a q, ale neumí se vracet (↑):
$ PAGER=more man bash
Nebo rolování vypni úplně pomocí cat
:
$ PAGER=cat man bash
Nebo jakýkoli jiný filtr – nikdo ti nezakazuje zadávat nesmysly:
$ PAGER=wc man bash
$ PAGER=tac man bash
$ PAGER=rev man bash