Možná jste použili syntaxi jako cmd0 | cmd1 | cmd2
ve vašem terminálu příliš často.
Pravděpodobně také víte, že je to přesměrování potrubí, které se používá k přesměrování výstupu jednoho příkazu jako vstupu do příkazu dalšího.
Ale víte, co se skrývá pod tím? Jak vlastně funguje přesměrování potrubí?
Nebojte se, protože dnes demystifikuji unixové dýmky, takže až příště půjdete na rande s těmi luxusními svislými pruhy, budete přesně vědět, co se děje.
Poznámka:Někdy jsem použil termín Unix, protože koncept rour (jako mnoho dalších věcí v Linuxu) pochází z Unixu.
Pipes v Linuxu:Obecná myšlenka
Zde je to, co všude uvidíte ohledně „co jsou unixové roury?“:
- Unixové kanály jsou mechanismem IPC (Inter Process Communication), který přeposílá výstup jednoho programu na vstup jiného programu.
Toto je obecné vysvětlení, které každý poskytuje. Chci jít hlouběji. Přeformulujme předchozí řádek techničtějším způsobem tím, že odstraníme abstrakce:
- Unixové kanály jsou mechanismem IPC (Inter Process Communication), který přebírá
stdout
programu a předá jej dostdin
jiného programu prostřednictvím vyrovnávací paměti.
Mnohem lepší. Odstraněním abstrakce to bylo mnohem čistší a přesnější. Jak potrubí funguje, můžete se podívat na následující diagram:
Jedním z nejjednodušších příkladů příkazu roura je předání nějakého výstupu příkazu příkazu grep pro vyhledání konkrétního řetězce.
Můžete například vyhledávat soubory s názvem obsahujícím txt takto:
Mějte na paměti:Pipe přesměruje stdout na stdin, ale ne jako argument příkazu
Jedna velmi důležitá věc k pochopení je, že roura přenáší stdout
příkazu do stdin
jiného, ale ne jako argument příkazu. Vysvětlím to na příkladu.
Pokud použijete cat
příkaz bez jakýchkoli argumentů, bude implicitně číst z stdin
. Zde je příklad:
$ cat
Subscribe to Linux Handbook for more articles like this
^D
Subscribe to Linux Handbook for more articles like this
Zde jsem použil cat
bez předávání jakýchkoli souborů, takže výchozí nastavení je stdin
. Dále jsem napsal řádek a pak pomocí Ctrl+d dal vědět, že jsem se psaním skončil (Ctrl+d znamená EOF nebo End Of File). Jakmile jsem dokončil psaní, kočka četla z stdin
a napsal tento řádek do stdout
.
Nyní zvažte následující příkaz:
echo hey | cat
Druhý příkaz NENÍ ekvivalentní příkazu cat hey
. Zde je stdout
, "hej", je přenesen do vyrovnávací paměti a přenesen do stdin
z cat
. Protože nebyly k dispozici žádné argumenty příkazového řádku, jako výchozí byl nastaven příkaz cat stdin
pro čtení a ve stdin už něco bylo, takže příkaz cat to vzal a vytiskl do stdout
.
Ve skutečnosti jsem vytvořil soubor s názvem hej a vložil do něj nějaký obsah. Rozdíl můžete jasně vidět na obrázku níže:
Typy kanálů v systému Linux
V Linuxu existují dva druhy kanálů:
- Nepojmenované kanály, nazývané také anonymní kanály
- Pojmenované kanály
Přečíst celý příběh
Zbytek článku je k dispozici pouze členům LHB. Nyní se můžete ZDARMA zaregistrovat a přečíst si zbytek tohoto článku spolu s přístupem ke všem příspěvkům pouze pro členy. Také se přihlásíte k odběru našeho čtrnáctidenního zpravodaje o Linuxu.
OdebíratUž máte účet?Přihlaste se