2014-03-05 55 views
4

我有一個班輪Perl的搜索和替換,看起來大致是這樣的:爲什麼即使失敗,我的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 

我做得WR翁?我應該修改我的腳本還是我調用Perl的方式?我天真地認爲,因爲Perl找不到該文件,它將以非零代碼退出。

+5

Perl在無法打開文件時不會自動退出。這一行是Perl的真正腳本,所以當涉及到打開時,它只是試圖打開文件。它無法寫入STDERR,因此無法知道腳本的其餘部分是否還有別的事情要做,因此它只是繼續。在這種情況下,沒有別的辦法了,因爲它只是循環遍歷文件的行。因此它通常在腳本結束時返回零。如果你想讓你的腳本「死」或「退出」一些特定的錯誤代碼,你必須將其添加到腳本。 – DeVadder

回答

4

您可以通過死亡強制錯誤,

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

因爲這不是一個致命的錯誤。如果您使用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仍然會被處理,但退出代碼將不爲零。

+0

已添加到答覆。 – ikegami