Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从从perl脚本内部调用的shell脚本返回退出代码_Perl_Shell_System_Exit - Fatal编程技术网

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

从从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

我有一个perl脚本(
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