【问题标题】:Why is my Perl in-place script exiting with a zero exit code even though it's failing?为什么我的 Perl 就地脚本以零退出代码退出,即使它失败了?
【发布时间】:2014-03-05 08:28:03
【问题描述】:

我有一个单行 Perl 搜索和替换,大致如下所示:

perl -p -i -e 's/foo/bar/' non-existent-file.txt

因为文件不存在(这不是故意的,但这是自动构建脚本的一部分,所以我想防止这种情况发生),Perl 退出并出现以下错误:

Can't open non-existent-file.txt: No such file or directory.

但是,退出代码仍然为零:

echo $?
0

我做错了吗?我应该修改我的脚本,还是我调用 Perl 的方式?我天真地假设因为 Perl 找不到该文件,它会以非零代码退出。

【问题讨论】:

  • Perl 在无法打开文件时不会自动退出。那个衬里是一个真正的 Perl 脚本,所以当涉及到打开时,它只是试图打开文件。它不能,因此写入 STDERR,但它不知道脚本的其余部分是否还有其他事情要做,所以它继续。在这种情况下,没有什么可做的,因为它只会遍历文件的行。因此它在脚本结束时正常完成,返回零。如果您希望您的脚本带有一些特定的错误代码 dieexit,您必须将其添加到脚本中。

标签: regex perl replace


【解决方案1】:

你可以通过死亡来强制错误,

perl -p -i -e 'BEGIN{ -f $ARGV[0] or die"no file" } s/foo/bar/' non-existent-file.txt

【讨论】:

    【解决方案2】:

    因为这不是致命错误。如果您使用perl -pe'...' file1 file2,即使file1 不存在,它也会继续处理file2

    以下导致发出任何警告都会导致非零退出代码。

    $ perl -i -pe'
       BEGIN {
          $SIG{__WARN__} = sub {
             ++$error;
             print STDERR $_[0];
          };
        }
    
        END { $? ||= 1 if $error; }
    
        s/foo/bar/g;
    ' file1 file2
    

    这意味着即使file1 不存在,file2 仍将被处理,但退出代码将非零。

    【讨论】:

      猜你喜欢
      • 2010-11-05
      • 1970-01-01
      • 2017-08-31
      • 1970-01-01
      • 2020-10-28
      • 1970-01-01
      • 2019-12-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多