Bash

Bash 從未重定向的管道接收 stderr

  • March 3, 2022

如果在沒有先重定向的情況下呼叫它,是否可以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“劫持”標準錯誤指向的地方,因為這將是一個很大的安全漏洞:流氓程序可能劫持某些列印敏感資訊的命令的輸出。

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