2012-08-11 21 views
37

Come posso reindirizzare lo stdout di più comandi a un singolo comando?Convogliare più comandi in un unico comando

Esempio 1: combinare e ordinare l'output di tutti i tre comandi echo:

echo zzz; echo aaa; echo kkk 

uscita desiderato

aaa 
kkk 
zzz 

Esempio 2: Riscrivi il seguente in modo che tutti i comandi sono in una singola riga di comando tramite pipe, senza reindirizzamenti a un file temporaneo:

setopt > /tmp/foo; unsetopt >> /tmp/foo; set >> /tmp/foo; sort /tmp/foo 

risposta

66

Utilizzare parentesi() per combinare i comandi in un singolo processo, che concatenerà lo stdout di ciascuno di essi.

Esempio 1 (si noti che $ è il prompt della shell):

$ (echo zzz; echo aaa; echo kkk) | sort 
aaa 
kkk 
zzz 


Esempio 2:

(setopt; unsetopt; set) | sort 
+12

+1. Puoi anche usare parentesi che non generano una subshell. La sintassi è un po 'più rigida: '{setopt; unsetopt; impostato; } | ordinare | less' - sono richiesti gli spazi bianchi attorno alle parentesi e il punto e virgola finale. –

+6

@glenn: non importa (testato in bash 3.2.48), poiché la pipeline lo costringe comunque in una subshell. –

+1

Va notato che '$' è il prompt, non parte del comando – Gilly

0

In Windows, sarebbe come segue: (echo zzz & echo aaa & echo kkk) | sort

O se è all'interno di un file batch può essere mono linea (come esempio) e multilinea:

(
echo zzz 
echo aaa 
echo kkk 
) | sort 

Nota: Il post originale non parlare del fatto che è solo per Linux, così ho aggiunto la soluzione per la linea di comando di Windows ... è molto utile quando si lavora con VHD/VHDX con diskpart all'interno degli script (echo diskpart_command) invece dell'eco sullo stesso, ma ci sia il echo, c'è anche un altro modo senza echos e con il redirector >, ma è molto soggetto a errori e molto più complesso da scrivere (perché usare un modo complicato di errori se esiste un modo semplice che funziona sempre bene) ... ricorda anche %d% ti dà il percorso reale (molto utile per non codificare il percorso dei file VHD/VHDX).

7

È possibile utilizzare {} per questo e eliminare la necessità di un sub-shell come in (list), in questo modo:

{ echo zzz; echo aaa; echo kkk; } | sort 

Abbiamo bisogno di uno spazio bianco dopo { e prima }. Abbiamo anche bisogno dell'ultimo ; quando la sequenza è scritta su una singola riga.

Potremmo anche scrivere su più righe senza la necessità di alcuna ;:

Esempio 1:

{ 
    echo zzz 
    echo aaa 
    echo kkk 
} | sort 

Esempio 2:

{ 
    setopt 
    unsetopt 
    set 
} | sort 
Problemi correlati