我正在学习一个教程,并看到了 和 的cat myfile.txt
使用cat < myfile.txt
。这两个命令序列有区别吗?似乎两者都将文件的内容打印到外壳。
答案1
在第一种情况下,cat
打开文件,在第二种情况下,shell 打开文件,并将其作为cat
的标准输入传递。
从技术上讲,它们可能会产生不同的效果。例如,可能有一个比cat
程序拥有更多(或更少)特权的 shell 实现。对于这种情况,一个可能无法打开文件,而另一个则可以。
这不是通常的情况,但提到它是为了指出 shell 和cat
不是同一个程序。
答案2
您的测试用例没有明显的重大差异。最明显的一个是如果当前目录中没有指定的文件myfile.txt
,或者不允许您读取它,则会收到错误消息。
在前一种情况下,cat
会抱怨,在后一种情况下,您的 shell 会清楚地显示哪个进程正在尝试打开文件,cat
在前一种情况下,在后一种情况下,您的 shell 会清楚地显示。
$ cat myfile.txt
cat: myfile.txt: No such file or directory
$ cat < myfile.txt
ksh93: myfile.txt: cannot open [No such file or directory]
在更一般的情况下,一个主要区别是使用重定向不能用于打印多个文件的内容,这毕竟是cat
(即猫enate)命令。请注意,shell 无论如何都会尝试打开作为重定向输入传递的所有文件,但实际上只会传递最后一个文件,cat
除非您使用zsh
及其multios
“zshism”。
$ echo one > one
$ echo two > two
$ cat one two # cat opens one, shows one, opens two, shows two
one
two
$ cat < one < two # sh opens one then opens two, cat shows stdin (two)
two
$ rm one two
$ echo one > one
$ cat one two # cat opens and shows one, fails to open two
one
cat: two: No such file or directory
$ cat < one < two # the shell opens one then opens two, fails and
# displays an error message, cat gets nothing on stdin
# so shows nothing
ksh93: two: cannot open [No such file or directory]
在标准系统上,shell 和cat
文件访问权限没有区别,因此两者都会成功或失败。正如 Thomas Dickey 的回复和所附评论已经建议的那样,使用sudo
来提高cat
的特权将会对行为产生很大的影响。
答案3
cat myfile.txt
读取文件myfile.txt
然后将其打印到标准输出。
cat < myfile.txt
这里cat
没有给出任何要打开的文件,所以像许多 Unix 命令一样,从标准输入读取数据,该数据由file.txt
shell 定向到那里,并打印到标准输出。
答案4
我们可以使用另一个命令来注意之间的区别:
wc –w food2.txt
可能的输出:
6 food2.txt
该命令告诉文件名,因为它知道它(作为参数传递)。
wc –w < food2.txt
可能的输出:
6
标准输入被重定向到文件,food2.txt
而命令不知道文件名。