如果在没有先重定向的情况下调用它,是否可以foo.sh
从内部接收/重定向stderr :?bar.sh
foo.sh | bar.sh
foo.sh
#!/bin/bash
echo "hello world" >&2
酒吧.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 是如何完好无损的:
原始答案:当您调用时
./foo.sh | ./bar.sh
,标准错误foo.sh
最终会出现在 shell 设置的任何位置(即在两个命令运行之前)。我不相信有可能(没有root访问权限)bar.sh
“劫持”标准错误指向的地方,因为这将是一个很大的安全漏洞:流氓进程可能劫持某些打印敏感信息的命令的输出。bash
提供速记: