Answers:
在第一种情况下,cat
打开文件,在第二种情况下,shell打开文件,将其作为cat
标准输入传递。
从技术上讲,它们可能会产生不同的效果。例如,可能有一个比该cat
程序有更多(或更少)特权的shell实现。对于这种情况,一个可能无法打开文件,而另一个可能。
那不是通常的情况,而是提到要指出的是Shell和cat
程序不是同一程序。
sudo cat myfile.txt
。但是,sudo cat < myfile.txt
如果您没有读取文件的权限,将无法使用。
ksh93
具有cat
内置功能(除非您/opt/ast/bin
处于早期状态,否则默认情况下未启用$PATH
)。
wc
给定参数时,将在计数前打印文件名。
您的测试用例没有重大的可见差异。最明显的是如果myfile.txt
当前目录中没有命名的文件,或者您不允许读取该文件,则会收到错误消息。
在前一种情况下,cat
将抱怨,在后一种情况下,您的外壳将清楚地显示哪个进程正在尝试打开文件(cat
在前一种情况下),而外壳在后一种情况下。
$ 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
(即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
特权将在行为上产生很大的不同。
ksh
自己的意志,如果这样,为什么?
bash
,它ksh93
是更好的外壳。它的外壳,几乎。
cat myfile.txt
读取文件,myfile.txt
然后将其打印到标准输出。
cat < myfile.txt
这里cat
没有打开任何文件,因此-与许多Unix命令一样-从标准输入读取数据,该输入file.txt
由外壳程序从那里引导,并打印到标准输出。
@Thomas Dickey的回答很棒。
我只想添加一些有关读取多个文件的事实(与您的问题无关,但仍然如此):
cat <file1 <file2 <file3
只会读取文件3,至少在bash中。(实际上,这取决于shell,但是大多数shell会将每个指定的文件都复制到stdin中,这会导致最后一个生效。)cat file1 file2 file3
会顺序读取所有指定的文件(实际上cat是concatenate的缩写形式)。cat file1 file2 file3 <file4 <file5 <file6
只会读取file1,file2,file3(因为在传递文件名参数时,cat会忽略stdin)。
cat file1 file2 - file3 <file4 <file5 <file6
将读取file1,file2,file6,file3(因为连字符强制cat不要忽略stdin)。关于错误。如果无法打开某些指定为参数的文件(不带<
),cat将跳过失败的文件(向stderr输出相关消息),但仍会读取其他文件。如果无法打开至少一个指定为重定向的文件(带有<
),则shell甚至不会启动cat(即使对于cat实际不使用的重定向,也会发生这种情况)。在这两种情况下,都会返回错误的退出代码。
cat
将仍然打开file1
和file2
,同样与file4
和file5
你的第三个例子。它只会显示file3
,分别。file6
如果这些先前的打开说明成功,则返回内容。