cat 打开不存在的文件时出现不同的错误

Zai*_*afi 22 command-line io-redirection cat

以下两个命令都尝试打开一个不存在的文件foo,但错误信息略有不同。可能是什么原因?

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory
Run Code Online (Sandbox Code Playgroud)

dr_*_*dr_ 30

cat foo
Run Code Online (Sandbox Code Playgroud)

这将运行cat带有参数的命令foo。屏幕上打印的错误完全取决于命令的程序员决定的内容。

cat < foo 
Run Code Online (Sandbox Code Playgroud)

这通过使用Bash stdin 重定向将文件内容提供foocat命令。如果该文件不存在,则是 Bash 抱怨它。


Cla*_*sen 21

$ cat fooshell(这里是 bash)中执行cat命令并传递参数foo. cat 程序选择将该参数解释为文件名 - 并尝试打开该文件。您看到的错误来自 cat 程序,它(自然地)无法打开文件。

该版本$ cat < foo是由外壳处理的重定向。<是一个 shell 操作符,它指示 shell 打开一个文件并将其重定向到 stdin。该文件不存在,因此您会收到“没有此类文件”。这次错误来自shell(bash)并且看起来有点不同。

这就是为什么您会看到 2 个不同的错误。原因是相同的 - 但它来自 2 个不同的程序(cat 和 bash)。

  • 否。在`cat &lt; foo` 中,如果重定向失败,则不会调用`cat`。这(并且具有一致的错误消息)是在可能的情况下使用重定向通常更好的原因之一。还要考虑一下 `cat &lt; in &gt; out` 和 `cat in &gt; out`,如果 `in` 不存在,前者会阻止 `out` 被覆盖(shell 在 `&lt; in` 重定向失败后立即取消命令并且不执行下一个 `&gt; out` 重定向,更不用说调用 `cat`)了。 (18认同)