bash中stderr重定向的意外行为
我对stdout/stderr的理解是,脚本可以登录到stderr,并在stdout中生成“有用”的输出,如果需要,调用进程将通过管道传输或捕获这些输出 实际上,这并不像我想象的那样有效bash中stderr重定向的意外行为,bash,shell,sh,Bash,Shell,Sh,我对stdout/stderr的理解是,脚本可以登录到stderr,并在stdout中生成“有用”的输出,如果需要,调用进程将通过管道传输或捕获这些输出 实际上,这并不像我想象的那样有效 ➜ cat test.sh echo diagnostic blah blah 1>&2 echo result 我的理解是,如果我做echo$./test.sh,我应该只得到“result”,因为“diagnostic blah”被发送到stderr。然而,我得到: ➜ echo $(./t
➜ cat test.sh
echo diagnostic blah blah 1>&2
echo result
我的理解是,如果我做echo$./test.sh,我应该只得到“result”,因为“diagnostic blah”被发送到stderr。然而,我得到:
➜ 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 only here:"
result=$(./test.sh) ## stderr goes straight to TTY, stdout gets captured
echo
echo "writing the previously-captured stdout:"
printf '%s\n' "$result" ## printf is better-defined than echo
Charles Duffy是对的-test.sh脚本按预期工作
我所调查的最初问题的根本原因更简单——我将所有日志输出从脚本重定向到stderr,但是我没有重定向脚本中其他命令的输出(在我的例子中是pip安装…您希望如何分辨哪些内容是由进程替换捕获的,随后由echo发出的,哪些内容将通过stderr直接发送到您的TTY?最终目的地是TTY双向。好的观点-将进行编辑以演示。到grep的管道只是巧合,你可以通过管道到任何东西,它将显示诊断废话,因为stderr被发送到TTY而不是通过管道。^yep➜ ./test.sh | grep任何诊断废话