打开不存在的文件时,cat给出了不同的错误


22

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

$ cat foo
cat: cannot open foo
$ cat < foo
-bash: foo: No such file or directory

12
伙计们,请不要仅根据格式来对帖子进行否决,特别是对于来自新手的帖子。在这里,这是一个非常有效的问题。
斯特凡Chazelas

21
它应该cat < food代替cat < foo
TulainsCórdova'16

6
@TulainsCórdova或者,在某些文化中food < cat;)
DepressedDaniel


1
仅第一个错误来自cat。现在,我想知道第二个消息是从哪里开始的,考虑到它以bash:... 开头
Dmitry Grigoryev

Answers:


30
cat foo

这将运行cat带有参数的命令foo。屏幕上显示的错误完全取决于命令编程人员的决定。

cat < foo 

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


20

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

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

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


18
如果重定向失败cat < foocat则不会调用中的编号。这(并具有一致的错误消息)是为什么在可能的地方使用重定向通常更好的原因之一。还要考虑cat < in > outvs (如果不存在)cat in > out防止out被覆盖的情况in(外壳在< in重定向失败后立即取消了该命令,并且不执行下一个> out重定向,更不用说调用了cat)。
斯特凡Chazelas

凉!纯逻辑。我会废话。
克劳斯·安德森
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.