Shell
如何在 zsh 中僅通過管道傳輸 stderr?
在 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
標準輸出的多重重定向。So
echo
的標準輸出現在被重定向到兩者/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
程序將非同步執行(就像以 啟動一樣&
)。