Bash
Bash 從未重定向的管道接收 stderr
如果在沒有先重定向的情況下呼叫它,是否可以
foo.sh
從內部接收/重定向stderr :?bar.sh``foo.sh | bar.sh
foo.sh
#!/bin/bash echo "hello world" >&2
bar.sh
#!/bin/bash sed -Eu 's/world/everyone/g'
user@pc$ ./foo.sh | ./bar.sh hello world user@pc$ ./foo.sh 2>&1 | ./bar.sh hello everyone
即使使用者不小心像第一個範例一樣呼叫它,是否可以
bar.sh
像第二個範例一樣進行行為?順便說一句,
foo.sh
可以是任何寫入stderr
. 我只是對如何從bar.sh
.
由於這個想法是過濾掉 stderr 上的數據,因此有一種更好的方法可以做到這一點,而不會合併流或失去所有 stderr:
my_command 2> >(grep --invert-match secret_regex >&2)
語法解釋:
2>
說“將標準錯誤發送到命令中的下一個單詞”>(some_command)
說將它之前的東西發送到命令的標準輸入。>&2
最後將grep
輸出(與秘密不匹配的行)發送回標準錯誤。範例,顯示過濾後 stdout 和 stderr 是如何完好無損的:
$ (echo output; echo error >&2; echo secret >&2) 2> >(grep --invert-match secret >&2) output error $ ((echo output; echo error >&2; echo secret >&2) 2> >(grep --invert-match secret >&2)) 2>/dev/null output $ ((echo output; echo error >&2; echo secret >&2) 2> >(grep --invert-match secret >&2)) >/dev/null error
原始答案:當您呼叫時
./foo.sh | ./bar.sh
,標準錯誤foo.sh
最終會出現在 shell 設置的任何位置(即在兩個命令執行之前)。我不相信有可能(沒有root訪問權限)bar.sh
“劫持”標準錯誤指向的地方,因為這將是一個很大的安全漏洞:流氓程序可能劫持某些列印敏感資訊的命令的輸出。