繁体   English   中英

回声$? 表现不同

[英]echo $? behaves differently

我有这个C程序:

int main() { return 10; }

运行完这个后我写echo $? 在终端上的版画10

现在假设我有一个.sh文件:

echo $?

运行C程序后,如果运行.sh文件,它将显示0

为什么?

简单: .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 $?

旁注:从程序中返回随机整数并不是最好的主意。 退出代码意味着某种意义。 这就是C标准库定义2个宏的原因:

printf("%d vs %d\n",
    EXIT_SUCCESS
    EXIT_FAILURE
);

猜猜是什么, EXIT_SUCCESS显示为0, EXIT_FAILURE为1。

如果要获取c程序的退出值,请同时在.sh文件中启动c程序,然后使echo $?。

./c_prog
echo $?

$的价值? 是最后一个命令的退出值。 如果您启动仅包含echo $?的bash脚本,则它们没有最后一个命令。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM