为什么会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只是打印了一条错误消息并继续。但即使是通过版本10,file
仅当无法读取文件时才以非零状态退出magic
,而无法读取数据文件时则不会。
不失败的一个可能原因file
是它不仅对文件内容感兴趣,而且对文件类型感兴趣,并且它认为“不存在”是与目录、符号链接、损坏的符号链接一起的特殊类型的文件,这是一个很弱的理由,因为不可读的文件实际上并不是一种特殊类型的文件,它是一个性质无法确定的文件,从任何明智的措施来看,这都是一个错误。此外,它可以应用于ls
,如果给定不存在的文件名,它仍然不会返回错误从版本 10 开始,但这最终成为普遍做法。
所以看来 的返回状态file
是一个被时间遗忘的错误。现在可能有一些脚本依赖于在file
文件不存在时不返回错误状态,现在更改已经太晚了。
答案2
此行为在 Linux 上有记录,并且是 POSIX 标准所要求的。来自file
Ubuntu 系统的手册:
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
文件手册页明确指出“如果文件不存在、无法读取或无法确定其文件状态,则不认为是影响退出状态的错误。输出表明文件已被处理,但无法确定类型。”