종료 상태가 0(성공)이 되는 이유는 무엇입니까 file xxx.src
?cannot open `xxx.src' (No such file or directory)
$ file xxx.src ; echo $?
xxx.src: cannot open `xxx.src' (No such file or directory)
0
참고: 비교 ls
:
$ ls xxx.src ; echo $?
ls: cannot access 'xxx.src': No such file or directory
2
답변1
피상적인 대답은 항상 그랬기 때문에 모두가 그렇게 한다는 것입니다.POSIX지적
file 피연산자로 명명된 파일이 존재하지 않거나, 읽을 수 없거나, file 피연산자로 명명된 파일 유형을 결정할 수 없는 경우, 이는 종료 상태에 영향을 미치는 오류로 간주되어서는 안 됩니다.
불행하게도 아무런 이유도 제시되지 않았으므로 POSIX가 이를 언급하는 유일한 명백한 이유는 역사적 관행입니다.
이 file
유틸리티는 다음에서 처음 등장했습니다.유닉스 연구 버전 41973년. 그 당시 표준 유틸리티는 오류를 확인하지 않았습니다(적어도 그 시점부터 프로세스가 반환 상태였음에도 불구하고).버전 3버전 2가 아닌 경우). 예를 들어, cat
파일이 존재하지 않으면 0이 아닌 상태 반환을 시작합니다.버전 8:버전 7오류 메시지를 인쇄하고 계속 진행합니다. 하지만 지나간다고 해도버전 10, file
파일을 읽을 수 없는 경우에만 0이 아닌 상태로 종료되지만 magic
데이터 파일을 읽을 수 없는 경우에는 종료되지 않습니다.
실패하지 않는 한 가지 가능한 이유 file
는 파일 내용뿐만 아니라 파일 유형에도 관심이 있고 "존재하지 않음"을 디렉터리, 심볼릭 링크, 손상된 심볼릭 링크와 함께 특별한 유형의 파일로 간주하기 때문입니다. 읽을 수 없는 파일은 실제로 특별한 유형의 파일이 아니기 때문에 약한 주장입니다. 이는 정의할 수 없는 성격의 파일이며 이는 합리적인 조치에 따른 실수입니다. 또한 적용할 수 있으며 ls
존재하지 않는 파일 이름이 주어져도 여전히 오류를 반환하지 않습니다.버전 10부터, 그러나 이는 결국 일반적인 관행이 되었습니다.
그래서 반품상태 file
는 시간이 지나 잊혀진 버그인 것 같습니다. 파일이 존재하지 않을 때 오류 상태를 반환하지 않는 것에 의존하는 일부 스크립트가 있을 수 있으며 file
지금은 이를 변경하기에는 너무 늦었습니다.
답변2
이 동작은 Linux에 문서화되어 있으며 POSIX 표준에서 요구됩니다. file
Ubuntu 시스템 매뉴얼 에서 :
EXIT STATUS
file will exit with 0 if the operation was successful or >0 if an error was encoun‐
tered. The following errors cause diagnostic messages, but don't affect the pro‐
gram exit code (as POSIX requires), unless -E is specified:
• A file cannot be found
• There is no permission to read a file
• The file type cannot be determined
-E
(위와 같이) :
$ file -E saonteuh; echo $?
saonteuh: ERROR: cannot stat `saonteuh' (No such file or directory)
1
Linux의 비표준 옵션은 다음 -E
과 같이 문서화되어 있습니다.
파일 시스템 오류(파일을 찾을 수 없음 등)의 경우 오류를 일반 출력으로 처리하고 POSIX에서 요구하는 대로 계속하는 대신 오류 메시지를 내보내고 종료합니다.
file
이 유틸리티에 대한 POSIX 사양(내가 강조한 것)은 다음과 같습니다.
피연산자로 명명된 파일이
file
존재하지 않거나, 읽을 수 없거나, 파일 피연산자로 명명된 파일 형식을 결정할 수 없는 경우,이는 종료 상태에 영향을 미치는 오류로 간주되어서는 안 됩니다..
답변3
파일 매뉴얼 페이지에는 "파일이 존재하지 않거나 읽을 수 없거나 해당 파일 상태를 확인할 수 없는 경우 종료 상태에 영향을 미치는 오류로 간주되지 않습니다. 출력에는 파일이 처리되었다고 표시되지만 형식은 단정할 수 없습니다."