В 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
Таким чином, echostdout '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.