【发布时间】:2020-09-08 15:10:07
【问题描述】:
我在嵌入式 linux (busybox) 上运行的应用程序尝试通过 popen(cmd, "r") 执行脚本。cmd = "sh /tmp/DF1_05/update.sh DF1_05"
我可以毫无问题地从 sh 手动启动这个脚本,但是当它被应用程序启动时它会失败。update.sh 脚本的第一行是:
#!/bin/sh
echo "Starting update script"
....
我什至看不到echo 输出。
我的应用程序代码是:
sprintf(cmd,"sh /tmp/%s/update.sh %s",version_ihm_usb,version_ihm_usb);
printf("Executing script %s\n", cmd);
pipe_cmd = popen(cmd,"r");
if (pipe_cmd != NULL) {
int ret = pclose(pipe_cmd);
printf("pclose returned %d:%d,%d\n", ret, WIFEXITED(ret), WEXITSTATUS(ret));
return 0;
} else {
printf("Error executing script : %s\n", strerror(errno));
}
应用程序输出为:
Executing script sh /tmp/DF1_05/update.sh DF1_05
pclose returned 36096:1,141
所以根据popen man page,pclose 输出的状态类似于wait4 输出的状态,当WIFEXITED(ret) 为真时,WEXITSTATUS(ret) 是孩子的输出状态.......
好的,但在那之后对我来说这是一次寻宝,事实上,我无法解释 141 是什么代码。
谁有更准确的信息?
【问题讨论】:
-
在交互式 shell 中手动运行
sh /tmp/%s/update.sh %s并在完成后检查echo $?。 -
您看不到
echo,因为您必须从pipe_cmd文件中读取它。您可以通过将set -x放入其中(或将其称为sh -x /tmp/...)来调试您的脚本;在这种情况下,输出出现在 stderr 上 -
好的,感谢你们两位,以更好的方式管理输出帮助我找到了问题。