jer*_*rry 5 bash pipe backticks
在bash中,如果我在反引号内执行一些管道命令,我怎样才能找到第一个命令的退出状态?
即在这种情况下,我试图获得"1".如果我不使用反引号,我可以通过PIPESTATUS [0]获得,但是当我想保存输出时它似乎不起作用:
## PIPESTATUS[0] works to give me the exit status of 'false':
$ false | true;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 1 0
## doesn't work:
$ a=`false | true`;
$ echo $? ${PIPESTATUS[0]} ${PIPESTATUS[1]};
0 0
Run Code Online (Sandbox Code Playgroud)
更一般地说,我试图完成:将某个程序输出的最后一行保存到变量,但能够判断程序是否失败:
$ myvar=` ./someprogram | tail -1 `;
$ if [ "what do i put here" ]; then echo "program failed!"; fi
Run Code Online (Sandbox Code Playgroud)
理想情况下,我也想了解发生了什么,而不仅仅是答案是什么.
谢谢.
尝试设置pipefail选项。它返回失败的管道的最后一个命令。一个例子:
首先我禁用它:
set +o pipefail
Run Code Online (Sandbox Code Playgroud)
创建perl脚本 ( script.pl) 来测试管道:
#!/usr/bin/env perl
use warnings;
use strict;
if ( @ARGV ) {
die "Line1\nLine2\nLine3\n";
}
else {
print "Line1\nLine2\nLine3\n";
}
Run Code Online (Sandbox Code Playgroud)
在命令行中运行:
myvar=`perl script.pl | tail -1`
echo $? "$myvar"
Run Code Online (Sandbox Code Playgroud)
得出:
0 Line3
Run Code Online (Sandbox Code Playgroud)
看起来是正确的,让我们看看pipefail启用:
set -o pipefail
Run Code Online (Sandbox Code Playgroud)
并运行命令:
myvar=`perl script.pl fail 2>&1 | tail -1`
echo $? "$myvar"
Run Code Online (Sandbox Code Playgroud)
得出:
255 Line3
Run Code Online (Sandbox Code Playgroud)