Řešení 1:
Osobně můj oblíbený (vyžaduje bash a další věci, které jsou standardní u většiny distribucí Linuxu)
Podrobnosti mohou hodně záviset na tom, co tyto dvě věci vydávají a jak je chcete sloučit ...
Obsah příkazů command1 a command2 po sobě ve výstupu:
cat <(command1) <(command2) > outputfile
Nebo pokud oba příkazy vypisují alternativní verze stejných dat, která chcete vidět vedle sebe (použil jsem to se snmpwalk; čísla na jedné straně a názvy MIB na druhé):
paste <(command1) <(command2) > outputfile
Nebo pokud chcete porovnat výstup dvou podobných příkazů (řekněme hledání ve dvou různých adresářích)
diff <(command1) <(command2) > outputfile
Nebo pokud se jedná o uspořádané výstupy nějakého druhu, sloučte je:
sort -m <(command1) <(command2) > outputfile
Nebo spusťte oba příkazy najednou (i když by to mohlo trochu zamotat):
cat <(command1 & command2) > outputfile
Operátor <() nastaví pojmenovanou rouru (nebo /dev/fd) pro každý příkaz, převede výstup tohoto příkazu do pojmenované roury (nebo /dev/fd reference filehandle) a předá název na příkazovém řádku. Existuje ekvivalent s>(). Můžete udělat:command0 | tee >(command1) >(command2) >(command3) | command4
například současně odeslat výstup jednoho příkazu 4 dalším příkazům.
Řešení 2:
Pomocí cat
můžete připojit dva páry k druhému , jak ukazuje gorila.
Můžete také vytvořit FIFO, nasměrovat na něj výstup příkazů a poté z FIFO číst pomocí jakéhokoli jiného programu:
mkfifo ~/my_fifo
command1 > ~/my_fifo &
command2 > ~/my_fifo &
command3 < ~/my_fifo
Obzvláště užitečné pro programy, které budou pouze zapisovat nebo číst soubor, nebo směšování programů, které vydávají pouze stdout/soubor, s jedním, který podporuje pouze druhý.
Řešení 3:
(tail -f /tmp/p1 & tail -f /tmp/p2 ) | cat > /tmp/output
/tmp/p1
a /tmp/p2
jsou vaše vstupní kanály, zatímco /tmp/output
je výstup.
Řešení 4:
Vytvořil jsem pro to speciální program:fdlinecombine
Čte více rour (obvykle výstupy programu) a zapisuje je do stdout po řádcích (můžete také přepsat oddělovač)
Řešení 5:
Zde buďte opatrní; Pouhým jejich zachycováním skončíte smícháním výsledků způsobem, který možná nechcete:například pokud jsou to soubory protokolu, pravděpodobně nebudete chtít, aby byl řádek z jednoho vložen do poloviny řádku z druhého. Pokud je to v pořádku, pak
tail -f /tmp/p1 /tmp/p2>/tmp/output
bude pracovat. Pokud není dobře, pak budete muset najít něco, co bude provádět ukládání do vyrovnávací paměti řádku a vypíše pouze úplné řádky. Syslog to dělá, ale nejsem si jistý, co jiného by mohlo.
EDIT:optimalizace pro čtení bez vyrovnávací paměti a pojmenované kanály:
považovat /tmp/p1 , /tmp/p2 , /tmp/p3 za pojmenované kanály, vytvořené "mkfifo /tmp/pN "
."ocas -q -f /tmp/p1 /tmp/p2 | awk '{print $0> "/tmp/p3"; close("/tmp/p3"); fflush();}' &
nyní tímto způsobem můžeme číst výstup s názvem roura "/tmp/p3" unbuffered od :
tail -f /tmp/p3
existuje malá chyba druhu, musíte "inicializovat" 1. vstupní potrubí /tmp/p1 pomocí:
echo -n> /tmp/p1
za účelem ocasu nejprve přijme vstup z 2. roury /tmp/p2 a nebude čekat, až něco přijde do /tmp/p1 . to nemusí být tento případ, pokud jste si jisti, /tmp/p1 obdrží vstup jako první.
Pro ocas je potřeba také volba -q netiskne nesmysly o názvech souborů.