Una tubazione è un elenco limitato di comandi. Qualsiasi reindirizzamento specificato si applica ai comandi costitutivi (semplici o composti), ma non alla pipeline nel suo complesso. Ogni pipe incatena lo stdout di un comando allo stdin del successivo applicando implicitamente un reindirizzamento a ciascuna subshell prima di, vengono valutati tutti i reindirizzamenti associati a un comando.
cmd 2>&1 | less
Prima stdout del primo sottoshell viene reindirizzato al tubo da cui less
sta leggendo. Successivamente, il reindirizzamento 2>&1
viene applicato al primo comando. Il reindirizzamento dello stderr allo stdout funziona perché lo stdout sta già puntando alla pipe.
cmd | less 2>&1
Qui, il reindirizzamento applica a less
. Lo stdout e lo stderr di Less sono presumibilmente iniziati puntati al terminale, quindi 2>&1
in questo caso non ha alcun effetto.
Se si desidera un reindirizzamento da applicare a un intero gasdotto, per raggruppare più comandi come parte di una conduttura, o alle condotte nido, quindi utilizzare un gruppo di comando (o di qualsiasi altro comando composto):
{ { cmd1 >&3; cmd2; } 2>&1 | cmd3; } 3>&2
Potrebbe essere un tipico esempio. Il risultato finale è: cmd1
e cmd2
's stderr ->cmd3
; cmd2
stdout ->cmd3
; e cmd1
e cmd3
s sterr e lo stdout cmd3
-> il terminale.
Se si utilizza la pipe |&
specifica di Bash, le cose si fanno strane, perché ogni reindirizzamento stdout della pipeline si verifica ancora per primo, ma il reindirizzamento stderr viene effettivamente per ultimo. Quindi, ad esempio:
f() { echo out; echo err >&2; }; f >/dev/null |& cat
Ora, contrariamente a ciò, l'output è nascosto. Il primo stdout di f
passa alla pipe, il successivo stdout di f
viene reindirizzato a /dev/null
e infine, stderr viene reindirizzato allo stdout (/dev/null
ancora).
Io raccomando di non usare mai |&
in Bash - è qui usato per la dimostrazione.
+1 spiegato bene – jordanm
+1. L'unica cosa che aggiungerei è che un pipe è un separatore di comandi, come punto e virgola. –
+1 Wow, ottima risposta @ormaaj! Esattamente quello che stavo cercando - grazie! –