【发布时间】:2017-06-08 04:18:28
【问题描述】:
我对 stdout/stderr 的理解是,脚本可以登录到 stderr,并在 stdout 中产生“有用”的输出,如果需要,调用进程将通过管道传输或捕获这些输出。
实际上,这并不像我想象的那样工作。
➜ cat test.sh
echo diagnostic blah blah 1>&2
echo result
我的理解是,如果我这样做echo $(./test.sh),我应该只得到“结果”,因为“诊断等等”已发送到标准错误。但是,我得到:
➜ echo $(./test.sh)
diagnostic blah blah
result
这可以正常工作,这表明重定向到 stderr 确实有效:
➜ echo $(./test.sh 2>/dev/null)
result
所以我猜我对如何在 shell 脚本中处理输出的理解是错误的。我错过了什么?
作为另一个例子,我不希望这会起作用:
➜ ./test.sh | grep diagnostic
diagnostic blah blah
【问题讨论】:
-
您希望如何知道哪些内容被进程替换捕获并随后由
echo发出,哪些内容通过stderr 直接发送到您的TTY?毕竟,最终目的地是双向的 TTY。 -
好点 - 将编辑演示。
-
管道到 grep 只是巧合,你可以管道到任何东西,它会显示
diagnostic blah blah,因为 stderr 被发送到 TTY 而不是通过管道。 -
^ 是的
➜ ./test.sh | grep anything-at-alldiagnostic blah blah