В bash:
$ echo hi 2>&1 1>/dev/null | cat
$
Перебуваючи в zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Чи є спосіб передавати лише стандартну помилку під час перенаправлення стандартної?
В bash:
$ echo hi 2>&1 1>/dev/null | cat
$
Перебуваючи в zsh:
$ echo hi 2>&1 1>/dev/null | cat
hi
$
Чи є спосіб передавати лише стандартну помилку під час перенаправлення стандартної?
Відповіді:
З zsh та з mult_ios
опцією увімкнено (увімкнено за замовчуванням) у:
echo hi 2>&1 1>/dev/null | cat
Це 1> /dev/null | cat
розглядається як багаторазове перенаправлення строки echo
's.
Отже echo
, stdout тепер перенаправляється на обидва, /dev/null
а на трубу cat
(ніби з використанням tee
).
Щоб скасувати це багаторазове перенаправлення, ви можете:
echo hi 2>&1 >&- > /dev/null | cat
Тобто, закриття stdout (скасування трубопроводу) перед перенаправленням на /dev/null
Або скористайтеся командною групою або підзарядкою, наприклад:
{echo hi 2>&1 1>/dev/null} | cat
(echo hi 2>&1 1>/dev/null) | cat
Таким чином, echo
stdout 's перенаправляється лише явно один раз (перенаправлення труби застосовується до групи / підпакеті і успадковується 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
.