W bash:
$ echo hi 2>&1 1>/dev/null | cat
$
Podczas pobytu w Zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Czy można przekierować tylko standardowy błąd podczas przekierowywania standardowego?
Z zsh i mult_ios
włączoną opcją (domyślnie włączone) w:
echo hi 2>&1 1>/dev/null | cat
Jest 1> /dev/null | cat
to postrzegane jako wielokrotne przekierowanie standardowego echo
wyjścia.
Tak echo
jest standardowe wyjście jest teraz skierowane do obu /dev/null
i potok cat
(tak jak przy użyciu tee
).
Aby anulować wielokrotne przekierowanie, możesz:
echo hi 2>&1 >&- > /dev/null | cat
Oznacza to, że zamknięcie stdout (anulowanie orurowania) przed przekierowaniem do /dev/null
Lub użyj grupy poleceń lub podpowłoki, takich jak:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
W ten sposób standardowe echo
wyjście jest przekierowywane tylko raz (przekierowanie potoku jest stosowane do grupy / podpowłoki i dziedziczone przez echo
).
Lub możesz multios
całkowicie wyłączyć :
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
Alternatywnie możesz użyć podstawienia procesu zamiast potoku:
echo hi 2> >(cat) > /dev/null
Należy jednak pamiętać, że gdy kontrola zadań jest wyłączona (jak w skryptach), cat
proces będzie działał asynchronicznie (tak, jakby zaczął się &
).
(echo hi 2>&1 1>/dev/null) | cat
.{echo...}|cat
)