Jedním z nejvýkonnějších shellových operátorů v Linuxu je roura. V tomto článku uvidíme, jak běžné a pojmenované roury fungují, jak je používat a jak se od sebe liší.
Pipes jsou jednou z nejcennějších funkcí příkazového řádku operačních systémů Linux a Unix. Trubky se používají v různých aplikacích. Pokud se podíváte na jakýkoli článek příkazového řádku systému Linux, všimnete si, že se často objevují kanály.
Symbol svislé čáry |
označuje potrubí. Díky rouře můžete převzít výstup z jednoho příkazu a vložit jej do jiného příkazu jako vstup.
Výsledkem je, že výstup jednoho příkazu lze použít jako vstup pro jiný a výstup tohoto příkazu lze použít jako vstup pro další příkaz atd.
Nejste tedy omezeni na jeden zadaný příkaz. Můžete je naskládat, kolikrát chcete.
Jinými slovy, roura je forma přesměrování používaná v Linuxu k odeslání výstupu jednoho programu do jiného programu k dalšímu zpracování. Trubky vám umožňují provádět operace, které shell po vybalení nepodporuje.
Syntaxe příkazu kanálu nebo nepojmenovaného kanálu je |
znak mezi libovolnými dvěma příkazy:
command1 | command2 | ... | commandN
Jak funguje potrubí v Linuxu
Chcete-li vidět, jak potrubí funguje, podívejme se na příklady níže.
Máme adresář plný mnoha různých typů souborů. Chceme tedy vědět, kolik souborů určitého druhu je v tomto adresáři.
Seznam souborů tedy můžeme snadno získat pomocí ls
příkaz:
ls -l
K oddělení typů souborů, které hledáme, použijeme grep. Například hledáme soubory se slovem txt
v jejich názvu nebo jako přípona souboru.
Použijeme speciální shellový znak |
směrovat ls
‘ výstup do grep
.
ls | grep txt
Jak můžete vidět z obrázku výše, výstup ls
příkaz nebyl odeslán do okna terminálu.
Výsledek se proto na obrazovce nezobrazí. Místo toho je přesměrován na vstup grep
příkaz. Výstup, který vidíme výše, pochází z grep
, poslední příkaz v tomto řetězci.
Nyní začněme prodlužovat náš řetězec. Můžeme počítat soubory txt
přidáním wc
příkaz k řetězu. Použijeme -l
možnost (počet řádků) s wc
.
ls | grep txt | wc -l
Ve výše uvedeném příkladu grep
již není posledním příkazem v řetězci, takže nevidíme jeho výstup. Místo toho výstup grep
se přivádí do wc
příkaz.
Výsledek, který vidíme v okně terminálu, pochází z wc
. Hlásí dva soubory, txt
v adresáři.
Co je to Named Pipe v Linuxu?
Jak už sám název napovídá, jedná se o dýmky s názvy. Jedním z klíčových rozdílů mezi běžnými kanály a pojmenovanými kanály je to, že pojmenované kanály jsou přítomny v systému souborů . To znamená, že se zobrazují jako soubory.
Pojmenovaná roura v Linuxu je metoda pro předávání informací z jednoho počítačového procesu do druhého pomocí roury, která má konkrétní název. Pojmenované dýmky jsou také známé jako FIFO, což znamená First In, First Out .
Pojmenovaný kanál můžete vytvořit pomocí mkfifo
příkaz. Například:
mkfifo mypipe
Zda je soubor pojmenovaným kanálem, poznáte podle p
bit v sekci oprávnění k souboru.
ls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 12:58 mypipe
Pojmenované kanály jsou soubory v samotném systému souborů. Na rozdíl od standardního kanálu je pojmenovaný kanál přístupný jako součást souborového systému, stejně jako jakýkoli jiný typ souboru.
Obsah pojmenovaného kanálu je umístěn v paměti, nikoli zapisován na disk. Prochází se tedy pouze tehdy, když jsou oba konce trubky otevřeny. A do roury můžete zapisovat několikrát, než se otevře na druhém konci a přečte.
Použití pojmenovaných kanálů vám umožní vytvořit proces, ve kterém jeden proces zapisuje do kanálu a jiný z něj čte, aniž byste se museli starat o načasování nebo pečlivé uspořádání jejich interakce.
Chcete-li vidět, jak fungují pojmenované kanály, podívejme se na příklady níže. Nejprve vytvoříme naše pojmenované potrubí:
mkfifo mypipe
Nyní pojďme používat zprávy s tímto potrubím.
tail -f mypipe
Otevřete další okno terminálu a napište zprávu do tohoto kanálu:
echo "hi" >> mypipe
Nyní v prvním okně můžete vidět vytištěné „ahoj“:
tail -f pipe1
hi
Protože je to roura a zpráva byla spotřebována, pokud zkontrolujeme velikost souboru, můžete vidět, že je stále 0:
ls -l mypipe
prw-r--r-- 1 root root 0 Mar 20 14:11 mypipe
Vzhledem k tomu, že pojmenovaná roura je pouze linuxový soubor, můžeme k odstranění jednoho použít příkaz rm. Pro odstranění potrubí, které jsme vytvořili v předchozích příkladech, bychom tedy spustili:
rm mypipe
Kdy použít běžné nebo pojmenované potrubí
Použití běžného kanálu místo pojmenovaného kanálu v Linuxu závisí na vlastnostech, které hledáme. Některé mohou být persistence, obousměrná komunikace, název souboru, vytvoření filtru a omezení přístupových oprávnění.
Pokud například chceme filtrovat výstup příkazu vícekrát, jeví se jako nejvhodnější možnost použití anonymního kanálu.
Na druhou stranu, pokud potřebujeme název souboru a nechceme ukládat data na disk, hledáme pojmenovaný kanál.
Na závěr, až budete příště pracovat s příkazy na linuxovém terminálu a zjistíte, že přesouváte data mezi příkazy, doufejme, že pomocí potrubí bude tento proces rychlý a snadný.
Závěr
Tento článek vám ukázal všestrannost potrubí při použití v příkazech Linuxu. Je však relativně jednoduchý, ale dokáže vyřešit širokou škálu komplikovaných dotazů.
Tento nástroj příkazového řádku je navíc jednoduchý a funguje s platformami UNIX a Linux.
Další informace o pipe
příkaz v systému Linux, podívejte se na stránku jeho příručky.