在 C 程序中获取 shell 脚本的退出代码

Posted

技术标签:

【中文标题】在 C 程序中获取 shell 脚本的退出代码【英文标题】:Getting the exit code of a shell script, in a C program 【发布时间】:2017-06-13 18:11:32 【问题描述】:

我有一个包含以下几行的 shell 脚本:

if [ $elof -eq 1 ];
then exit 3
else if [  $elof -lt 1 ];then
    exit 4
else
    exit 5
fi
fi

在我的 C 程序中,我使用 popen 来执行这样的脚本:

char command[30];
char script[30];
scanf("%s", command);
strcpy(script, "./myscript.sh ");
strcat(script, command);
FILE * shell;
shell = popen(script, "r");
if(WEXITSTATUS(pclose(shell))==3) 
   //code

else if(WEXITSTATUS(pclose(shell))==4)
  //code

现在,我如何获取脚本的退出代码?我尝试使用WEXITSTATUS,但它不起作用:

WEXITSTATUS(pclose(shell))

【问题讨论】:

您所展示的内容没有提供足够的上下文。请显示一段完整的代码以及预期和实际输出。 显示更多你的 C 代码...顺便说一句,如果 WIFEXITED() 评估为 true,你应该只使用 WEXITSTATUS() 我已经编辑了我的 C 代码。 不要多次致电pclose(shell) @melpomene 你说得对,我忘了。但是如果我使用WEXITSTATUS 并将其打印到控制台,我会得到 0。但我的脚本仅以 3、4 或 5 退出。这怎么可能? 【参考方案1】:

After you have closed a stream, you cannot perform any additional operations on it.

在对文件对象调用pclose 之后,不应再调用readwrite 甚至pclose

pclose 表示您已完成FILE *,它将释放所有底层数据结构 (proof)。

第二次调用它可以产生任何东西,包括0

您的代码应如下所示:

...
int r = pclose(shell);
if(WEXITSTATUS(r)==3)

            printf("AAA\n");

else if(WEXITSTATUS(r)==4)

            printf("BBB\n");
 else 
    printf("Unexpected exit status %d\n", WEXITSTATUS(r));

...

【讨论】:

以上是关于在 C 程序中获取 shell 脚本的退出代码的主要内容,如果未能解决你的问题,请参考以下文章

shell脚本或C程序返回值为什么不能大于255

linux c程序中获取shell脚本输出的实现方法

inux C程序中获取shell脚本输出(如获取system命令输出)

如何在linux中使用shell脚本杀死进程时获取退出代码=0

如何获取批处理脚本的任务计划程序上次运行结果退出代码?

如何获取在 shell 脚本中运行的 R 脚本的退出状态