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?
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:
Con zsh e con l' mult_ios
opzione 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 echo
stdout viene ora reindirizzato a entrambi /dev/null
e 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 echo
stdout viene reindirizzato esplicitamente una sola volta (il reindirizzamento della pipe viene applicato al gruppo / subshell ed ereditato da echo
).
Oppure puoi disabilitare del multios
tutto:
(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 cat
processo verrà eseguito in modo asincrono (come se fosse iniziato con &
).
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
.