Úkolem interpretace symbolu roury jako instrukce ke spuštění více procesů a propojení výstupu jednoho procesu do vstupu jiného procesu je odpovědnost shellu (/bin/sh nebo ekvivalent).
Ve vašem příkladu se můžete buď rozhodnout, že použijete svůj plášť nejvyšší úrovně k provedení potrubí takto:
find -name 'file_*' -follow -type f -exec zcat {} \; | agrep -dEOE 'grep'
Pokud jde o efektivitu, tyto výsledky stojí jedno vyvolání find, četné vyvolání zcat a jedno vyvolání agrep.
To by vedlo k tomu, že by se vytvořil pouze jediný proces agrep, který by zpracoval veškerý výstup produkovaný četnými voláními zcat.
Pokud byste z nějakého důvodu chtěli agrep vyvolat vícekrát, můžete:
find . -name 'file_*' -follow -type f \
-printf "zcat %p | agrep -dEOE 'grep'\n" | sh
Tím se vytvoří seznam příkazů, které se spouštějí pomocí rour, a ty se pak odešlou do nového shellu, aby se skutečně provedly. (Vynechání posledního "| sh" je příjemný způsob, jak ladit nebo provádět suché běhy příkazových řádků, jako je tento.)
Pokud jde o efektivitu, tyto výsledky stojí jedno vyvolání find, jedno vyvolání sh, četné vyvolání zcat a četné vyvolání agrep.
Nejúčinnějším řešením z hlediska počtu vyvolání příkazů je návrh od Paula Tomblina:
find . -name "file_*" -follow -type f -print0 | xargs -0 zcat | agrep -dEOE 'grep'
... což stojí jedno vyvolání find, jedno vyvolání xargů, několik vyvolání zcat a jedno vyvolání agrep.
řešení je snadné:spustit přes sh
... -exec sh -c "zcat {} | agrep -dEOE 'grep' " \;