【问题标题】:Returning an exit code from a shell script that was called from inside a perl script从 perl 脚本内部调用的 shell 脚本返回退出代码
【发布时间】:2011-11-26 06:10:50
【问题描述】:

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

在 shell 脚本中,我设置了几个带有特定退出代码的退出,我希望能够根据返回的退出代码执行不同的操作。

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

这是因为即使 shell 脚本内部的某些东西失败了,实际的脚本却成功运行了?

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

【问题讨论】:

  • 我今天也遇到了同样的问题,你找到解决办法了吗?

标签: perl shell system exit


【解决方案1】:

$? 应该从您的 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 是一个错字,这意味着您的 system() 调用失败。你还记得chmod +x /tmp/test.sh吗?也打印出$!,它会告诉你系统失败的原因。
  • @Nick:我使用的是 5.12.4,但是(在切换到打印后)这适用于任何 perl5,一直到 90 年代中期的古老版本。
  • 是的,bas;h 是一个错字。这是我正在运行的(与上面相同的 test.sh 文件)$ perl -e 'system("/tmp/test.sh"); print $?' 它打印“-1”(我正在运行 perl 5.8 btw)
  • @Nick:print $! 有什么要说的?我认为您错过了我的第一条评论(或者我们的编辑被交叉,您没有看到更改)。
猜你喜欢
  • 1970-01-01
  • 2013-08-28
  • 1970-01-01
  • 1970-01-01
  • 2018-01-23
  • 2014-06-05
  • 2013-01-26
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多