Passaggio di due argomenti a un command tramite pipes

Di solito, dobbiamo solo passare un argomento:

echo abc | cat echo abc | cat some_file - echo abc | cat - some_file 

C'è un modo per passare due argomenti? Qualcosa di simile a

 {echo abc , echo xyz} | cat cat `echo abc` `echo xyz` 

Potrei solo memorizzare entrambi i risultati in un file in primo luogo

 echo abc > file1 echo xyz > file2 cat file1 file2 

Ma allora potrei sovrascrivere accidentalmente un file, che non va bene. Questo sta entrando in uno script non interattivo. Fondamentalmente, ho bisogno di un modo per passare i risultati di due comandi arbitrari al cat senza scrivere su un file.


AGGIORNAMENTO: Spiacente, l'esempio maschera il problema. Mentre { echo abc ; echo xyz ; } | cat { echo abc ; echo xyz ; } | cat { echo abc ; echo xyz ; } | cat sembra funzionare, l'output è dovuta echo s, non al cat .

Un esempio migliore sarebbe { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, { cut -f2 -d, file1; cut -f1 -d, file2; } | paste -d, che non funziona come previsto.

Con

 file1: a,b c,d file2: 1,2 3,4 

L'output prevista è:

 b,1 d,3 

DELIBERATO:

Utilizzare la sostituzione del process : cat <(command1) <(command2)

In alternativa, fare i tubi denominati utilizzando mkfifo :

 mkfifo temp1 mkfifo temp2 command1 > temp1 & command2 > temp2 & cat temp1 temp2 

Meno elegante e più verboso, ma funziona bene, fintanto che assicuri che temp1 e temp2 non esistono prima di mano.

Penso che tu desideri 'Sostituzione di process' http://tldp.org/LDP/abs/html/process-sub.html . Funziona anche su zsh, anche se ha più opzioni e la syntax può essere diversa.

Crea un pseudo file ( /dev/fd/something ) per each sostituzione. È abbastanza utile. Il command può solo leggere come un stream, il che significa che non può andare avanti e indietro con fseek. Deve leggerla come un stream di byte, come un pipe.

I vostri esempi funzionano come sostituzione di process:

 cat <(echo abc) <(echo xyz) paste -d, <(cut -f2 -d, file1) <(cut -f1 -d, file2) 

Pensate ad esso come uno strumento per utilizzare un process e farlo fingere di essere un file senza file temp.

(dalla mia risposta precedente )

Le parentesi graffe ricciate funzionano in realtà perché l'operatore del pipe collega le uscite standard dei comandi raggruppati nell'ingresso standard del terzo.

È ansible dire che la printing non è dall'eco eseguendo qualsiasi command che non utilizzi l'input standard, ad esempio { echo 1; echo 2;} | echo 3 { echo 1; echo 2;} | echo 3 { echo 1; echo 2;} | echo 3 stamperà 3 in contrasto con 1 \ n2 \ n3.

Tuttavia, questa non è la cosa che hai voluto perché i due comandi nelle parentesi graffe ricorrenti stanno scrivendo alla stessa output che è come cat loro risultati. Per generare due risultati diversi da utilizzare come due argomenti per i comandi come la paste , è necessario utilizzare un file temporaneo o un pipe denominato.

È ansible utilizzare mktemp per generare un file temporaneo unico o mkfifo per creare un file di pipe FIFO.

Mi piace xargs Come esempio voglio trovare la dimensione di tutti i dati di mysql dir sotto / usr / local

 osx: utente locale $ pwd
 / Usr / local
 osx: utente locale $ ls |  grep mysql 
 mysql
 mysql-5.0.51a-osx10.5-x86_64
 mysql-5.0.51b-osx10.5-x86_64
 mysql-5.1.39-osx10.5-x86_64
 mysql-5.6.17-osx10.7-x86_64
 os x: utente locale $ ls |  grep mysql | sudo xargs du -sh
 4.0K mysql
 2.8G mysql-5.0.51a-osx10.5-x86_64
  10G mysql-5.0.51b-osx10.5-x86_64
  25G mysql-5.1.39-osx10.5-x86_64
 753M mysql-5.6.17-osx10.7-x86_64
 osx: utente locale $ 

xargs