In der Bash:
$ echo hi 2>&1 1>/dev/null | cat
$
Während in zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Gibt es eine Möglichkeit, nur Standardfehler umzuleiten, während Standard heraus umgeleitet wird?
In der Bash:
$ echo hi 2>&1 1>/dev/null | cat
$
Während in zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Gibt es eine Möglichkeit, nur Standardfehler umzuleiten, während Standard heraus umgeleitet wird?
Antworten:
Mit zsh und mit der mult_ios
Option on (standardmäßig on) in:
echo hi 2>&1 1>/dev/null | cat
Das 1> /dev/null | cat
wird als mehrfache Umleitung von echo
's stdout angesehen.
Also wird echo
stdout jetzt zu beiden umgeleitet /dev/null
und eine Pipe zu cat
(als ob benutzt tee
).
Um diese Mehrfachumleitung abzubrechen, haben Sie folgende Möglichkeiten:
echo hi 2>&1 >&- > /dev/null | cat
Das heißt, Sie schließen stdout (brechen die Rohrleitung ab), bevor Sie zu umleiten /dev/null
Oder verwenden Sie eine Befehlsgruppe oder Subshell wie:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Auf diese Weise wird echo
die stdout nur einmal explizit umgeleitet (die Pipe-Umleitung wird auf die Gruppe / Subshell angewendet und von übernommen echo
).
Oder Sie können multios
insgesamt deaktivieren :
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Alternativ können Sie die Prozessersetzung anstelle einer Pipe verwenden:
echo hi 2> >(cat) > /dev/null
Beachten Sie jedoch, dass bei deaktivierter Jobsteuerung (wie in Skripten) der cat
Prozess asynchron ausgeführt wird (als würde er mit gestartet &
).
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
.