Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
bash中stderr重定向的意外行为_Bash_Shell_Sh - Fatal编程技术网

bash中stderr重定向的意外行为

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

我对stdout/stderr的理解是,脚本可以登录到stderr,并在stdout中生成“有用”的输出,如果需要,调用进程将通过管道传输或捕获这些输出

实际上,这并不像我想象的那样有效

➜ 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任何诊断废话