我是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 find 都具有退出状态 0。execv()
我的实现将错误从ed 子级传播fork()
到父级,而其他实现似乎直接从子级打印错误而不告诉父级。
我之所以问这个问题,而不是仅仅改变行为以匹配其他问题,是因为使用posix_spawn()
. 的实现posix_spawn()
被允许将execv()
错误传播到errno
父级中,例如glibc
,musl
两者都这样做。似乎无法判断错误是发生在 之前还是之后fork()
,并且可能来自fork()
(例如ENOMEM
)之前的错误应该导致非零退出状态。
我已经阅读了POSIX 规范find
,但这里的细节很简单。但是,我听说其他地方记录了其他可能相关的规则。例如,我听说如果一个实用程序打印到标准错误,它也必须以非零退出代码退出,这似乎暗示其他find
s 不兼容。但我不确定那个措辞在哪里,或者它是否真的存在。
POSIX 规范
find
在其STDERR
部分中说,(“否则”跟随 的描述
-ok
,此处不相关。)这需要根据Utility Description Defaults来理解,它指定
因此,如果所有符合 POSIX 的实用程序仅在以指示错误的状态退出时才允许输出到标准错误,这不是真的;但对于有具体提及的实用程序来说确实如此,其中包括
find
.