为什么我的Perl就地脚本退出时出现零退出代码,即使它失败了?

时间:2014-03-05 08:28:04

标签: regex perl replace

我有一个单行的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无法找到该文件,所以它将以非零代码退出。

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:4)

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

以下原因导致发出任何警告,导致退出代码为非零。

$ perl -i -pe'
   BEGIN {
      $SIG{__WARN__} = sub {
         ++$error;
         print STDERR $_[0];
      };
    }

    END { $? ||= 1 if $error; }

    s/foo/bar/g;
' file1 file2

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