En bash:
$ echo hi 2>&1 1>/dev/null | cat
$
En zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Existe-t-il un moyen de ne diriger que l'erreur standard lors de la redirection de la sortie standard?
En bash:
$ echo hi 2>&1 1>/dev/null | cat
$
En zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Existe-t-il un moyen de ne diriger que l'erreur standard lors de la redirection de la sortie standard?
Réponses:
Avec zsh et avec l' mult_ios
option on (on par défaut), dans:
echo hi 2>&1 1>/dev/null | cat
Le 1> /dev/null | cat
est considéré comme une redirection multiple de echo
la sortie standard de.
La echo
sortie standard de So est désormais redirigée vers les deux /dev/null
et vers un canal cat
(comme si vous l'utilisiez tee
).
Pour annuler cette redirection multiple, vous pouvez faire:
echo hi 2>&1 >&- > /dev/null | cat
Autrement dit, fermer stdout (annulation de la tuyauterie) avant de rediriger vers /dev/null
Ou utilisez un groupe de commandes ou un sous-shell comme:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
De cette façon, echo
la sortie standard de 's n'est redirigée explicitement qu'une seule fois (la redirection de canal est appliquée au groupe / sous-shell et héritée par echo
).
Ou vous pouvez désactiver multios
complètement:
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Alternativement, vous pouvez utiliser la substitution de processus au lieu d'un canal:
echo hi 2> >(cat) > /dev/null
Sachez toutefois que lorsque le contrôle des travaux est désactivé (comme dans les scripts), le cat
processus s'exécute de manière asynchrone (comme s'il était démarré avec &
).
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
.