在我的shell程序中获取C程序的返回码

mol*_*ule 14 c bash shell

假设我有一个名为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

  • 有趣的选择.就像一张纸条.这只有在管道中的所有其他程序都返回0时才有效.来自doc链接:只要测试程序后面没有任何程序报告非零退出代码,管道就会报告其退出代码为测试程序. (2认同)

Joh*_*024 6

这将指定输出的最后一行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)