在Perl调用之前获取命令的退出代码

时间:2014-12-17 22:35:54

标签: linux bash perl

如何在Perl内部获取Perl调用之前运行的命令的退出代码?

$ ls asdf
ls: asdf: No such file or directory
$ perl -le 'print $?'
0

我希望它返回2(退出状态为ls)。

$ ls asdf
ls: asdf: No such file or directory
$ perl -le 'print $ENV{"?"}'

返回空行。

$ ls asdf
ls: asdf: No such file or directory
$ perl -le "print $?"
2

使用shell插值我可以得到我的结果。但这不是我想要的,因为我需要一个独立的Perl脚本中的退出代码。

4 个答案:

答案 0 :(得分:1)

尝试这样做:

xxx; perl -le 'print $ARGV[0]' $?

xxx; perl -le 'print '"$?"''

但是后者很大程度上取决于你正在使用的SHELL,应该避免使用

答案 1 :(得分:1)

尝试:

$ ls asdf
$ EC=$? perl -le 'print $ENV{"EC"}'

perl -le 'print $?'不起作用,因为$之间没有关系?在你的shell和Perl中的那个 - Perl只是为了简单而重新使用了这个名称。

答案 2 :(得分:1)

$?不是真正的环境变量。

$ export '?'
-bash: export: `?': not a valid identifier

这意味着您需要明确地将其传递给脚本。这两种安全而简单的方法是

perl -E'say $ARGV[0]' $?

EC=$? perl -E'say $ENV{EC}'

但我理解你,而不是必须指定$?。如果是这样,那么你应该做的是让你的脚本执行上一个命令而不是在你的脚本之前执行它

#!/usr/bin/perl
# usage: wrapper program [arg [...]]
use feature qw( say );
system { $ARGV[0] } @ARGV;
say $? & 0x7F ? 0x80 | ($? & 0x7F) : $? >> 8;

$ true

$ echo $?
0

$ wrapper true
0

$ false

$ echo $?
1

$ wrapper false
1

$ perl -e'kill INT => $$'

$ echo $?
130

$ wrapper perl -e'kill INT => $$'
130

答案 3 :(得分:0)

  

我的脚本是一个短信实用程序,你可以在运行一些命令后调用它来执行数小时/天的执行时间,例如: big_job; sms.pl +4512131415 "job is done"。我希望邮件以' ok'为前缀。或者'错误'取决于退出状态。

# usage: notify bigjob [arg [...]]

phone="+4512131415"

if "$@" ; then
   sms.pl "$phone" "job succeeded"
else
   sms.pl "$phone" "job failed"
fi