Як я можу трубу тільки stderr в zsh?


18

В bash:

$ echo hi 2>&1 1>/dev/null | cat
$

Перебуваючи в zsh:

$ echo hi 2>&1 1>/dev/null | cat
hi
$

Чи є спосіб передавати лише стандартну помилку під час перенаправлення стандартної?

Відповіді:


22

З 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процес буде працювати асинхронно (як би розпочато з &).


3
Спасибі! Ще один спосіб її обійти (echo hi 2>&1 1>/dev/null) | cat.
Тавіан Барнс

1
@TavianBarnes, хороший момент, дякую. Я додав його до відповіді для повноти. Він також працює з командною групою ( {echo...}|cat)
Stéphane Chazelas
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.