Eu sou o autor de uma find
substituição que tenta ser compatível com POSIX (e com muitas extensões populares). Recentemente notei uma discrepância entre o comportamento do meu utilitário e outras find
implementações, e quero saber se o POSIX permite meu comportamento ou se preciso alterá-lo.
$ 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
Pelo menos GNU, busybox e FreeBSD find têm status de saída 0 neste caso. Minha implementação propaga o execv()
erro do fork()
filho ed para o pai, enquanto as outras implementações parecem imprimir o erro diretamente do filho sem informar ao pai.
A razão pela qual faço essa pergunta, em vez de apenas alterar o comportamento para corresponder aos outros, é que parece difícil de fazer ao usar posix_spawn()
. Implementações de posix_spawn()
podem propagar execv()
erros errno
no pai e, por exemplo, glibc
e musl
ambos fazem isso. Parece impossível dizer se o erro ocorreu antes ou depois do fork()
, e presumivelmente erros anteriores ao fork()
(por exemplo ENOMEM
) devem levar a um status de saída diferente de zero.
Eu li a especificação POSIX parafind
, mas é leve em detalhes aqui. No entanto, ouvi dizer que existem outras regras documentadas em outros lugares que podem ser relevantes. Por exemplo, ouvi dizer que se um utilitário imprimir com erro padrão, ele também deve sair com um código de saída diferente de zero, o que parece implicar que os outros find
s não são compatíveis. Mas não tenho certeza de onde está esse texto, ou se ele realmente existe.
A especificação POSIX para
find
diz, em suaSTDERR
seção,(“Caso contrário” segue uma descrição de
-ok
, que não é relevante aqui.)Isso precisa ser entendido à luz dos Padrões de Descrição do Utilitário , que especificam que
Portanto, não é verdade que todos os utilitários compatíveis com POSIX só têm permissão para gerar erro padrão se saírem com um status indicando um erro; mas é verdade para utilitários com a menção específica, e isso inclui
find
.