从从perl脚本内部调用的shell脚本返回退出代码
我有一个perl脚本(从从perl脚本内部调用的shell脚本返回退出代码,perl,shell,system,exit,Perl,Shell,System,Exit,我有一个perl脚本(verifyCopy.pl),它使用system()调用shell脚本(intercp.sh) 在shell脚本中,我设置了几个带有特定退出代码的退出,我希望能够根据返回的退出代码执行不同的操作 我尝试过使用$?,我尝试过将系统(“./intercp.sh”)的值赋给一个变量,然后检查该变量的值,但错误消息始终为0 这是因为即使shell脚本中的某些东西失败了,实际的脚本仍能成功运行吗 我尝试在shell脚本中添加一个陷阱(即trap testexit退出和testexit
verifyCopy.pl
),它使用system()
调用shell脚本(intercp.sh
)
在shell脚本中,我设置了几个带有特定退出代码的退出,我希望能够根据返回的退出代码执行不同的操作
我尝试过使用$?
,我尝试过将系统(“./intercp.sh”)
的值赋给一个变量,然后检查该变量的值,但错误消息始终为0
这是因为即使shell脚本中的某些东西失败了,实际的脚本仍能成功运行吗
我尝试在shell脚本中添加一个陷阱(即
trap testexit退出
和testexit(){EXIT 222;}
),但这也不起作用。$?
应该捕获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脚本中是否有问题。你使用的是什么版本的perl?我只是从你发布的上述代码中得到-1:\@Nick:假设bas;h
是一个打字错误,这意味着y我们的system()调用失败。您是否记得chmod+x/tmp/test.sh
?也打印出$!
,这将告诉您系统失败的原因。@Nick:我使用的是5.12.4,但是(在切换到打印后)这对任何perl5都很好,可以追溯到90年代中期的一个古老版本。是的,bas;h是一个打字错误。下面是我正在运行的(与上面的test.sh文件相同)$perl-e'系统(“/tmp/test.sh”);print$?”
它打印“-1”(我运行的是perl 5.8 btw)@尼克:那么,print$!
有什么要说的呢?我想你错过了我的第一条评论(或者我们的编辑错了,你没有看到更改)。我今天遇到了完全相同的问题,你找到解决方案了吗?
$ cat /tmp/test.sh
#!/bin/sh
exit 2
$ perl -E 'system("/tmp/test.sh"); say $?'
512