繁体   English   中英

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

[英]Get exit code of command prior to Perl invocation

如何在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脚本中的退出代码。

试着这样做:

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

要么

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

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

尝试:

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

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

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

$ 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

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

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

phone="+4512131415"

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM