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

在我的shell程序中获取C程序的返回代码,c,bash,shell,C,Bash,Shell,假设我有一个名为Foo.C的C程序,它正在打印一些东西并返回一个名为rc的值,我正在shell程序中执行该值,如下所示: foobar=$(Foo | tail-1) 现在,变量foobar具有程序Foo的最后打印值。但是,在不干扰这一点的情况下,我想在我的shell程序中获取程序的返回代码。恐怕您必须使用临时文件来存储Foo程序的输出,获取返回代码,然后执行tail-1。如下所示: Foo > /tmp/temp_file ret=$? foobar=$(tail -1 /tmp/tem

假设我有一个名为
Foo.C
的C程序,它正在打印一些东西并返回一个名为
rc
的值,我正在shell程序中执行该值,如下所示:

foobar=$(Foo | tail-1)


现在,变量foobar具有程序
Foo
的最后打印值。但是,在不干扰这一点的情况下,我想在我的shell程序中获取程序的返回代码。

恐怕您必须使用临时文件来存储Foo程序的输出,获取返回代码,然后执行tail-1。如下所示:

Foo > /tmp/temp_file
ret=$?
foobar=$(tail -1 /tmp/temp_file)

这将
Foo
输出的最后一行分配给
foobar
,Foo的退出代码分配给
code

{ read -r foobar; read code; } < <( (Foo; echo $? ) | tail -2)
以及:

$Foo(){echo“第二次测试”;true;}

${read-r foobar;read code;}<如果您使用的是
bash
shell,那么可以使用
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
$
manbash

管道状态

一个数组变量,包含最近执行的前台管道(可能只包含一个命令)中进程的退出状态值列表

您可以使用“set-o pipefail”选项

这里我的程序a.out返回100

或者另一个选项是使用pipestatus环境变量。你可以在这里读到。

$?
给出最后执行的命令的返回值。

使用
$?
变量。我不确定$?在这种情况下,由于他使用的是管道,所以可以正常工作。所以最后执行的命令是tail-1。我做了一个简单的测试,但它不起作用。最后一个返回值是尾部返回代码,它不起作用。美元?变量显示值0,即使我将
rc
值硬编码为
rc=100;返回rc参见man bash:管道的返回状态是最后一条命令的退出状态Hey John。。谢谢你的回答,但是Foo是一个C函数。但是如果
Foo
没有输出任何东西,或者它的最后一行输出没有以换行符结尾,那么这就失败了。@kirtan如果Foo是不是一个C函数,这没有什么区别。脚本的工作方式相同。有趣的选项。作为一个注释。这仅在管道中的所有其他程序返回0时才起作用。从doc链接:只要测试程序后面没有程序报告非零退出代码,管道将报告其退出代码为测试程序的退出代码。来自@sat的答案解释了为什么
$?
不适用于此问题。这是在portable shell中执行此操作的唯一方法。。。。但是,您的演示应该在以后使用并删除临时文件。
$ Foo() { echo "2nd Test"; true; }
$ { read -r foobar; read code; } < <( (Foo; echo $? ) | tail -2)
$ echo "foobar=$foobar code=$code"
foobar=2nd Test code=0
$ tail sat | wc -l
tail: cannot open ‘sat’ for reading: No such file or directory
0
$ echo "${PIPESTATUS[0]} ${PIPESTATUS[1]}"
1 0
$
[root@myserver Test]# set -o pipefail
[root@myserver Test]# ./a.out | tail -l
[root@myserver Test]# echo $?
100