我意识到,cat sth
两者cat < sth
恰好给出了相同的输出。它们是一样的吗?
答案1
它们并不完全相同。在重要的情况下,重定向方法通常会给出更烦人和模糊的结果(当然这可能是您想要的)。
$ cat < /proc/self/maps
$ cat /proc/self/maps
55c61257e000-55c61258a000 r-xp 00000000 fd:00 1180143 /usr/bin/cat
...
或者尝试 grep,搜索程序
$ grep "grep" /proc/self/exe
Binary file /proc/self/exe matches
$ grep "grep" < /proc/self/exe
$
sudo
有点作弊,但是当使用, 运行具有访问权限的命令时,您最有可能遇到这种情况root
:
$ sudo cat < /etc/shadow
bash: /etc/shadow: Permission denied
$ sudo cat /etc/shadow
root:!::0:99999:7:::
....
答案2
cat
的工作就是欺骗猫enate 它得到的所有内容,然后将其打印在标准输出上,但通常用于打印单个文件的内容(当然,这只是连接给它的所有一个文件的内容,然后将其写入标准输出)。 stdout(标准输出)只是程序通常写入的输出数据。 (有些程序(如dd
)会将其输出数据写入 stdout,除非参数另有说明,并且还有标准错误通道 stderr,程序在发生错误时会写入该通道。)
cat
可以获取通过 stdin(标准输入)提供给它的数据或作为参数传递给它的文件中的数据。
您要做的就是使用单个参数cat sth
进行调用,告知将文件中的所有内容写入标准输出。您可以添加更多文件名,并看到文件的内容被连接起来,然后写入标准输出。cat
sth
cat
sth
cat < sth
在调用之前将 stdin 更改cat
为文件的内容。然后从标准输入中读取所有内容并将其写入标准输出。sth
cat
cat
在这两种情况下,cat
都将文件的内容写入sth
标准输出。您可以阅读更多相关内容这里还可以man cat
在终端中输入内容以阅读cat
描述其功能的手册页。
请注意, 的内容sth
由您登录的用户读取(您在终端中登录的用户不一定是您在图形会话中登录的用户(如果有)),而程序可以使用通过在它们之前写入不同的权限sudo
,然后以执行它们的用户的权限读取。这可能会导致不同的结果,因为您登录的用户和您切换到的用户sudo
(不一定root
,您可以另外指定)可能对您尝试读取的文件具有不同的访问权限。
答案3
在 的特定情况下cat
,打印文件与使用或sth
一样有效,因为该命令设计为打印作为命令行参数给出的所有文件(情况:将接收字符串作为参数,并将打开文件)或,如果没有给出文件,则打印标准输入(这种情况:shell 将通过打开并将其连接到的标准输入来遵循重定向)。cat sth
cat <sth
cat
cat sth
cat
sth
cat <sth
sth
cat
因此,两种情况下相同的行为特定于cat
;对于设计为仅接受标准输入或命令行参数之一的命令,它可能根本不起作用。在其他情况下,行为可能略有不同,因为当通过标准输入获取数据时,命令可能无法访问文件名;比较:
$ grep -H foo sth
sth:foo
$ grep -H foo <sth
(standard input):foo