[英]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.