如果运行shell命令失败,如何导致脚本失败?

时间:2017-06-07 14:56:25

标签: perl shell exec die

我在Amazon Linux上使用Perl 5.16.3。我有以下代码,如果执行shell命令失败,我想发送电子邮件...

use IPC::Run qw/run/;
...
my @cmd = ("find", "$myuserDir", "-type", "f", "-exec", "touch", "'{}'", "\;");
my $out_and_err;
run( \@cmd, '>&', \$out_and_err )
    or send_email_on_failure($?, "run: status=$out_and_err", $email_on_failure);
die(" @cmd ");

然而,我注意到的是执行正在转移到" die"语句(" send_email_on_failure"在发送电子邮件后还包含一个die语句),即使shell命令导致错误。下面是shell命令在其自己的

上运行时会发生的情况
[myuser@mymachine scripts]$ find /usr/java/jboss/standalone/myuserments/myapp.war -type f -exec touch
find: missing argument to `-exec'

如何重写Perl语句以便正确注册失败并正确执行路由?

修改

my @cmd = ("find", "$myuserDir", "-type", "f", "-exec", "touch", "'{}'", "\;");
my $out_and_err;
...
            run( \@cmd, '>&', \$out_and_err ) == 0 or die("failed to execute command");
            die("run");

打印出" run"而不是"未能执行命令"。

编辑2:

好的,这是send_email函数的主体

sub send_email_on_failure
{
    die("failed to execute command");
}

1 个答案:

答案 0 :(得分:1)

IPC::Run的文档包含 RETURN VALUES

  当所有子命令以0结果代码退出时,

run()和finish()返回TRUE。 这与perl的system()命令相反。

所以我之前的回答是无关紧要的,而且问题似乎是send_email_on_failure,您似乎非常不愿意向我们展示。


如果您提供的信息量很少,则无法确定,但如果run调用system并传回其返回值,则零表示成功,而非零表示某种情况失败

这与Perl中的约定相反,其中非零是

之类的成功
open my $fh, '<', 'file' or die $!

并且可能足以将您的通话更改为

run(...) == 0 or send_email_on_failure(...)

然而,软件工程不能通过反复试验来完成,这仅仅是猜测。即使它适用于你,它仍然是错误的做法,你必须解释这两个神秘的子程序调用真正做些什么才能得到正确的答案