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()
。エラーが以前に発生したのか後に発生したのかを区別することは不可能に見え、以前に発生したエラーのために(例えば)終了状態がゼロ以外の結果になる可能性があります。posix_spawn()
execv()
errno
glibc
musl
fork()
fork()
ENOMEM
私が読んでPOSIX仕様find
、ここでは詳しく説明していません。しかし、関連性のある他の規則が他の場所で文書化されていると聞きました。たとえば、ユーティリティが標準エラーで印刷している場合は、ゼロ以外の終了コードで終了する必要があり、これは他のsが互換性がないことを意味していると聞きましたfind
。しかし、このフレーズがどこにあるのか、実際に存在するのかはよくわかりません。
答え1
POSIX仕様は、そのセクションfind
で次のように言います。STDERR
それ以外の場合、標準エラーは診断メッセージにのみ使用する必要があります。
(「そうでなければ」は説明の後にありますので、-ok
ここでは関係ありません。)
これは次の状況に基づいて理解する必要があります。ユーティリティ説明デフォルト、これは以下を指定します。
このセクションが「標準エラーは診断メッセージにのみ適用されます」とリストされている場合、特に指定がない限り、終了ステータスはエラーが発生し、ユーティリティがこのボリュームPOSIX.1で説明されているように使用されている場合にのみメッセージが使用されることを意味します。 。 2017.
だからそれは本当ではありません。みんなPOSIX準拠のユーティリティは、終了時にステータスがエラーを示す場合にのみ標準エラーへの出力を許可しますが、これは特に言及されているユーティリティですfind
。