Come posso pipe solo stderr in zsh?


18

In bash:

$ echo hi 2>&1 1>/dev/null | cat
$

Mentre in zsh:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

Esiste un modo per reindirizzare solo l'errore standard durante il reindirizzamento dell'output standard?

Risposte:


22

Con zsh e con l' mult_iosopzione on (on di default), in:

echo hi 2>&1 1>/dev/null | cat

Il 1> /dev/null | catè visto come un reindirizzamento multiplo di echo's stdout.

Quindi lo echostdout viene ora reindirizzato a entrambi /dev/nulle una pipe a cat(come se stesse usando tee).

Per annullare il reindirizzamento multiplo, puoi fare:

echo hi 2>&1 >&- > /dev/null | cat

Cioè, chiudendo stdout (annullando le tubazioni) prima di reindirizzare a /dev/null

Oppure usa un gruppo di comandi o una subshell come:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

In questo modo, lo echostdout viene reindirizzato esplicitamente una sola volta (il reindirizzamento della pipe viene applicato al gruppo / subshell ed ereditato da echo).

Oppure puoi disabilitare del multiostutto:

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

In alternativa, è possibile utilizzare la sostituzione del processo anziché una pipe:

echo hi 2> >(cat) > /dev/null

Attenzione, tuttavia, quando il controllo del processo è disattivato (come negli script), il catprocesso verrà eseguito in modo asincrono (come se fosse iniziato con &).


3
Grazie! Un altro modo per aggirare è (echo hi 2>&1 1>/dev/null) | cat.
Tavian Barnes,

1
@TavianBarnes, buon punto, grazie. L'ho aggiunto alla risposta per completezza. Funziona anche con un gruppo di comando ( {echo...}|cat)
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.