find
나는 POSIX(그리고 널리 사용되는 많은 확장)를 준수하려는 대체 버전의 작성자입니다 . 최근에 나는 내 유틸리티의 동작과 다른 find
구현 사이의 차이점을 발견했으며 POSIX가 내 동작을 허용하는지 아니면 이를 변경해야 하는지 궁금합니다.
$ find . -exec /no/such/file {} \;
find: ‘/no/such/file’: No such file or directory
$ echo $?
0
$ bfs . -exec /no/such/file {} \;
bfs: error: .: -exec /no/such/file: No such file or directory.
$ echo $?
1
이 경우 최소한 GNU, busybox 및 FreeBSD는 모두 종료 상태가 0으로 표시됩니다. 내 구현은 ed 하위 항목 execv()
에서 fork()
상위 항목으로 오류를 전파하는 반면, 다른 구현에서는 상위 항목에 알리지 않고 하위 항목에서 직접 오류를 인쇄하는 것처럼 보입니다.
다른 질문 과 일치 하도록 동작을 변경하는 것이 아니라 이 질문 을 하는 이유는 posix_spawn()
. 오류가 이전에 발생했는지 이후에 발생했는지 구분하는 것은 불가능해 보이며, 이전에 발생한 오류로 인해(예를 들어) 종료 상태가 0이 아닌 결과가 나올 수도 있습니다.posix_spawn()
execv()
errno
glibc
musl
fork()
fork()
ENOMEM
내가 읽고POSIX 사양find
, 여기에는 자세히 설명되어 있지 않습니다. 그러나 관련성이 있을 수 있는 다른 규칙이 다른 곳에서 문서화되어 있다고 들었습니다. 예를 들어, 유틸리티가 표준 오류로 인쇄하는 경우 0이 아닌 종료 코드로 종료해야 하며 이는 다른 s가 호환되지 않음을 의미하는 것으로 들었습니다 find
. 하지만 이 문구가 어디에 있는지, 실제로 존재하는지 잘 모르겠습니다.
답변1
POSIX 사양은 해당 섹션 find
에서 다음과 같이 말합니다.STDERR
그렇지 않으면 표준 오류는 진단 메시지에만 사용해야 합니다.
("그렇지 않으면"은 설명 뒤에 나오므로 -ok
여기서는 관련이 없습니다.)
이는 다음 상황을 토대로 이해해야 합니다.유틸리티 설명 기본값, 이는 다음을 지정합니다.
이 섹션이 "표준 오류는 진단 메시지에만 해당됩니다."로 나열되면 달리 명시하지 않는 한 종료 상태가 오류 발생을 나타내고 유틸리티가 이 볼륨 POSIX.1에 설명된 대로 사용되는 경우에만 메시지가 사용된다는 의미입니다. 2017.
그래서 그건 사실이 아니야모두POSIX 호환 유틸리티는 종료 시 상태가 오류를 나타내는 경우에만 표준 오류로의 출력을 허용하지만 이는 특별히 언급된 유틸리티(예: find
.