Shell

如何在 zsh 中僅通過管道傳輸 stderr?

  • February 23, 2016

在 bash 中:

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

在 zsh 中:

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

有沒有辦法在重定向標準輸出時只傳遞標準錯誤?

使用 zsh 和mult_ios選項on(預設情況下),在:

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

1> /dev/null | cat視為echo標準輸出的多重重定向。

Soecho的標準輸出現在被重定向到兩者/dev/null和一個管道cat(就像使用tee)。

要取消該多重重定向,您可以執行以下操作:

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

也就是說,在重定向到之前關閉標準輸出(取消管道)/dev/null

或使用命令組或子shell,例如:

{echo hi 2>&1 1>/dev/null} | cat 
(echo hi 2>&1 1>/dev/null) | cat

這樣,echo的標準輸出只被顯式重定向一次(管道重定向應用於組/子shell並由 繼承echo)。

或者您可以完全禁用multios

(setopt nomultios; echo hi 2>&1 > /dev/null | cat)

或者,您可以使用程序替換而不是管道:

echo hi 2> >(cat) > /dev/null

但是請注意,當作業控制關閉時(如在腳本中),該cat程序將非同步執行(就像以 啟動一樣&)。

引用自:https://unix.stackexchange.com/questions/265061