从perl脚本内部调用的shell脚本返回退出代码

时间:2011-09-27 17:26:40

标签: perl shell system exit

我有一个使用verifyCopy.pl来调用shell脚本(system())的perl脚本(intercp.sh)。

从shell脚本中,我已经设置了几个具有特定退出代码的出口,我希望能够根据返回的退出代码做不同的事情。

我尝试使用$?,我尝试将system("./intercp.sh")的值分配给变量然后检查其值,但错误消息始终为0.

这是因为即使shell脚本中的某些内容失败,实际脚本也会成功运行吗?

我尝试在shell脚本中添加一个陷阱(即trap testexit EXITtestexit() { exit 222; },但这也不起作用。

1 个答案:

答案 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脚本中是否存在问题。