在我的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