“猫”和“猫

“猫”和“猫

我正在学习一个教程,并看到了 和 的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.txtshell 定向到那里,并打印到标准输出。

答案4

我们可以使用另一个命令来注意之间的区别:

wc –w food2.txt

可能的输出:

6 food2.txt

该命令告诉文件名,因为它知道它(作为参数传递)。

wc –w < food2.txt

可能的输出:

6

标准输入被重定向到文件,food2.txt而命令不知道文件名。

相关内容