我有一个使用verifyCopy.pl
来调用shell脚本(system()
)的perl脚本(intercp.sh
)。
从shell脚本中,我已经设置了几个具有特定退出代码的出口,我希望能够根据返回的退出代码做不同的事情。
我尝试使用$?
,我尝试将system("./intercp.sh")
的值分配给变量然后检查其值,但错误消息始终为0.
这是因为即使shell脚本中的某些内容失败,实际脚本也会成功运行吗?
我尝试在shell脚本中添加一个陷阱(即trap testexit EXIT
和testexit() { exit 222; }
,但这也不起作用。
答案 0 :(得分:0)
$?
应该从shell脚本中捕获退出代码。
$ cat /tmp/test.sh
#!/bin/sh
exit 2
$ perl -E 'system("/tmp/test.sh"); say $?'
512
请记住,$?
是以传统方式编码的,因此$? >> 8
会提供退出代码,$? & 0x7F
会提供信号,如果核心被转储,则$? & 0x80
为真。有关详细信息,请参阅perlvar。
您的问题可能是以下几种情况之一:也许您的shell脚本实际上没有退出退出代码(也许您想要set -e
);也许你有一个信号句柄供SIGCHLD吃掉退出代码;尝试使用上面非常简单的shell脚本进行测试,看看它在perl脚本或shell脚本中是否存在问题。