В Баш:
$ echo hi 2>&1 1>/dev/null | cat
$
Пока в зш
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Есть ли способ передать только стандартную ошибку при перенаправлении стандарта?
В Баш:
$ echo hi 2>&1 1>/dev/null | cat
$
Пока в зш
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Есть ли способ передать только стандартную ошибку при перенаправлении стандарта?
Ответы:
С zsh и включенной mult_ios
опцией (по умолчанию), в:
echo hi 2>&1 1>/dev/null | cat
The 1> /dev/null | cat
рассматривается как многократное перенаправление echo
s-stdout.
Таким образом echo
, stdout теперь перенаправляется на оба /dev/null
канала и на канал cat
(как при использовании tee
).
Чтобы отменить это многократное перенаправление, вы можете сделать:
echo hi 2>&1 >&- > /dev/null | cat
То есть закрытие стандартного вывода (отмена трубопровода) перед перенаправлением на /dev/null
Или используйте группу команд или подоболочку, например:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Таким образом, стандартный echo
вывод перенаправляется только один раз (перенаправление канала применяется к группе / подоболочке и наследуется echo
).
Или вы можете multios
полностью отключить :
(setopt nomultios; echo hi 2>&1 > /dev/null | cat)
В качестве альтернативы вы можете использовать замену процесса вместо канала:
echo hi 2> >(cat) > /dev/null
Однако помните, что когда управление заданиями отключено (как в сценариях), cat
процесс будет выполняться асинхронно (как если бы он был запущен &
).
{echo...}|cat
)
(echo hi 2>&1 1>/dev/null) | cat
.