为什么“file xxx.src”会导致“无法打开‘xxx.src’(没有这样的文件或目录)”,但退出状态为0(成功)?

为什么“file xxx.src”会导致“无法打开‘xxx.src’(没有这样的文件或目录)”,但退出状态为0(成功)?

为什么会file xxx.src导致cannot open `xxx.src' (No such file or directory)但退出状态为 0(成功)?

$ 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指出

如果文件操作数命名的文件不存在、无法读取或无法确定文件操作数命名的文件类型,则不应将其视为影响退出状态的错误。

不幸的是,没有给出任何理由,所以 POSIX 声明这一点的唯一明显原因是历史实践。

file实用程序首次出现于Unix 研究版本 41973 年。当时,标准实用程序不检查错误(即使进程至少从那时起就有返回状态)版本3如果不是版本 2)。例如,cat如果文件不存在,则开始返回非零状态版本8版本7只是打印了一条错误消息并继续。但即使是通过版本10file仅当无法读取文件时才以非零状态退出magic,而无法读取数据文件时则不会。

不失败的一个可能原因file是它不仅对文件内容感兴趣,而且对文件类型感兴趣,并且它认为“不存在”是与目录、符号链接、损坏的符号链接一起的特殊类型的文件,这是一个很弱的理由,因为不可读的文件实际上并不是一种特殊类型的文件,它是一个性质无法确定的文件,从任何明智的措施来看,这都是一个错误。此外,它可以应用于ls,如果给定不存在的文件名,它仍然不会返回错误从版本 10 开始,但这最终成为普遍做法。

所以看来 的返回状态file是一个被时间遗忘的错误。现在可能有一些脚本依赖于在file文件不存在时不返回错误状态,现在更改已经太晚了。

答案2

此行为在 Linux 上有记录,并且是 POSIX 标准所要求的。来自fileUbuntu 系统的手册:

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

文件手册页明确指出“如果文件不存在、无法读取或无法确定其文件状态,则不认为是影响退出状态的错误。输出表明文件已被处理,但无法确定类型。”

相关内容