Al momento della mia stesura di questo, la sintassi della risposta accettata era errata per la maggior parte, se non per tutte, le shell derivate da Bourne, incluso bash
. Ho suggerito una modifica all'inizio e ho accettato la risposta per risolverlo, ma ero anche incline ad aggiungere tutte queste altre informazioni, e questo sarebbe stato più una riscrittura che una modifica.
Puoi usare i comandi composti:
{ grep ...; bzgrep ...; } >file
..o subshells (notare le parentesi anziché le parentesi graffe):
(grep ...; bzgrep ...) >file
..per raggruppare i comandi. Il modo subshell ha una sintassi migliore (più tollerante della mancanza di spazi bianchi e consente di omettere l'ultimo punto e virgola), ma o forgia un nuovo processo, o "finge" di farlo eseguire i comandi in un ambiente pulito. Entrambi hanno vantaggi a seconda di ciò che si desidera fare, che non importa qui, ma vale la pena cercare se si desidera una maggiore competenza con la shell.
Nota: puoi usare il pipelining anche con questi trucchi, quindi potresti fare qualcosa del genere:
{ grep ...; bzgrep ...; } | less
PS se non si preoccupano l'ordinamento delle partite in vostro output combinato, è possibile utilizzare un unico &
tra i due comandi, in questo modo: { grep ... & bzgrep ...; }
. Quindi i due comandi vengono eseguiti contemporaneamente: grep
viene avviato e la shell lo mette in background, quindi la shell eseguirà il bzgrep
. (Ma c'è un piccolo avvertimento a riguardo, con la spiegazione che riguarda il reindirizzamento dei file e il buffering del flusso di file potenzialmente causando una porzione molto piccola delle righe nel file di output da dividere / alterare: se vedresti che ciò dipenderà da come grep
, bzgrep
e le libc
stdio.h
funzioni sono implementate. Nella maggior parte delle implementazioni, credo che reindirizzare il comando prima di reindirizzare a un file eviterà il problema, quindi potresti fare { foo & bar; } | cat - >file
una soluzione alternativa.)