假设我有一个名为C程序Foo.c,它正在打印一些东西并返回一个名为rc我在shell程序中执行的值,如下所示:
foobar=$(Foo | tail -1)
现在,变量foobar具有程序的最后打印值Foo.但是在不打扰这个的情况下,我想rc在shell程序中获取程序的返回码.
sat*_*sat 13
如果您使用的是bashshell,则可以使用PIPESTATUS数组变量来获取pipe进程的状态.
$ tail sat | wc -l
tail: cannot open ‘sat’ for reading: No such file or directory
0
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0
$
Run Code Online (Sandbox Code Playgroud)
来自man bash:
PIPESTATUS
一个数组变量,包含最近执行的前台管道中的进程的退出状态值列表(可能只包含一个命令).
小智 13
您可以使用"set -o pipefail"选项.
[root@myserver Test]# set -o pipefail
[root@myserver Test]# ./a.out | tail -l
[root@myserver Test]# echo $?
100
Run Code Online (Sandbox Code Playgroud)
这里我的程序a.out返回100.
或者另一种选择是使用pipestatus环境变量.你可以在这里读到它. http://www.linuxnix.com/2011/03/pipestatus-internal-variable.html
这将指定输出的最后一行Footo foobar和Foo的退出代码分配给code:
{ read -r foobar; read code; } < <( (Foo; echo $? ) | tail -2)
Run Code Online (Sandbox Code Playgroud)
该<(...)构造称为过程替换.在上面的代码中,read命令从进程替换中接收stdin.因此tail -2,过程替换产生总共两行.第一行是生成的最后一行Foo,它被分配给foobar.第二个被分配给code.
第一和第二之间的空间<是必不可少的.
在创建函数Foo之后,可以测试以上内容:
$ Foo() { echo "Testing"; false; }
$ { read -r foobar; read code; } < <( (echo "Testing"; false; echo $? ) | tail -2)
$ echo "foobar=$foobar code=$code"
foobar=Testing code=1
Run Code Online (Sandbox Code Playgroud)
和:
$ Foo() { echo "2nd Test"; true; }
$ { read -r foobar; read code; } < <( (Foo; echo $? ) | tail -2)
$ echo "foobar=$foobar code=$code"
foobar=2nd Test code=0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5039 次 |
| 最近记录: |