2014-03-05 1 views
4

나는 한 라이너 펄 검색을하고이 같은 약 보이는 대체 :Perl 내부 스크립트가 실패하더라도 종료 코드가 없으면 종료되는 이유는 무엇입니까?

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

파일이 의도하지 않은 (존재하지 않지만,이 때문에, 자동화 된 빌드 스크립트의 일부이기 때문에 내가) 그으로부터 보호하려는, 펄이 오류와 함께 종료 :

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

그러나, 종료 코드는 여전히 제로 :

echo $? 
0 

내가 뭔가 WR을하고 있는가 그거야? 스크립트 나 Perl을 호출하는 방법을 수정해야합니까? 필자는 Perl이 파일을 찾을 수 없기 때문에 0이 아닌 코드로 종료 할 것이라고 순진하게 추측했습니다.

+5

파일을 열 수 없으면 Perl이 자동으로 종료되지 않습니다. 그 하나의 라이너는 Perl을위한 실제 스크립트이기 때문에 열려있을 때 파일을 열려고 시도합니다. STDERR에 기록 할 수 없으므로 STDERR에 기록하지만 나머지 스크립트에서 수행 할 작업이 있는지 여부를 알 수 없으므로 계속 진행됩니다. 이 경우에는 파일의 행을 반복 할 때 수행 할 작업이 없습니다. 그리고 스크립트의 끝에서 정상적으로 끝나고 0을 반환합니다. 특정 오류 코드로 스크립트를 '죽게'또는 '종료'하려면 스크립트에 추가해야합니다. – 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을 계속 처리합니다.

다음은 경고가 발행되어 종료 코드가 0이 아닙니다.

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

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

    s/foo/bar/g; 
' file1 file2 

file1이 존재하지 않는 경우에도 file2이 계속 처리되지만, 종료 코드가 아닌 0이됩니다 것을 의미합니다.

+0

답변을 추가했습니다. – ikegami

관련 문제