我有这个C程序:
int main() { return 10; }
在终端中编写echo $?
后运行此操作后,它会打印10
。
现在假设我有一个.sh
文件:
echo $?
运行C程序后,如果我运行.sh
文件,则会打印0
。
为什么?
答案 0 :(得分:2)
简单:.sh
文件由bash或其他shell执行。该二进制文件(/bin/bash
或其中的任何位置)执行脚本然后退出。如果shell二进制文件成功退出,它会将 0 返回给系统
在bin将10返回到系统后,执行.sh文件后,将启动一个新的shell进程(此shell不会执行您的程序)。所以echo $?
可能回应执行shell实例运行的另一个进程的返回值(登录,或者其他......)
命令echo $?
回显您执行的最后一个程序返回的退出代码的值。如果你的C程序,它返回10,所以你看到10出现。您的.sh
文件虽然由另一个二进制文件执行,但返回0(成功时),因此echo $?
显示为0.
假设你这样做:
./your_bin
./your.sh
echo $?
//--> echoes 0
./your_bin
echo $?
//--> echoes
如果你在bash脚本中执行二进制文件,以及你的脚本“转发”那个二进制文件的退出代码,那么简单地写一下:
#!/bin/bash
./your_bin
exit $?
附注:从程序中返回随机的int不是最好的想法。退出代码意味着什么。这就是C标准lib定义2个宏的原因:
printf("%d vs %d\n",
EXIT_SUCCESS
EXIT_FAILURE
);
猜猜是什么,EXIT_SUCCESS
显示为0,EXIT_FAILURE
为1。
答案 1 :(得分:1)
如果你想获得你的c程序的退出值,你也可以在.sh文件中启动你的c程序,然后创建echo $?
./c_prog
echo $?
$的价值?是最后一个命令的退出值。如果启动仅包含echo $?的bash脚本,则它们没有最后一个命令。