cat sth 与 cat < sth 的区别

cat sth 与 cat < sth 的区别

我意识到,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进行调用,告知将文件中的所有内容写入标准输出。您可以添加更多文件名,并看到文件的内容被连接起来,然后写入标准输出。catsthcatsth

cat < sth在调用之前将 stdin 更改cat为文件的内容。然后从标准输入中读取所有内容并将其写入标准输出。sthcatcat

在这两种情况下,cat都将文件的内容写入sth标准输出。您可以阅读更多相关内容这里还可以man cat在终端中输入内容以阅读cat描述其功能的手册页。

请注意, 的内容sth由您登录的用户读取(您在终端中登录的用户不一定是您在图形会话中登录的用户(如果有)),而程序可以使用通过在它们之前写入不同的权限sudo,然后以执行它们的用户的权限读取。这可能会导致不同的结果,因为您登录的用户和您切换到的用户sudo(不一定root,您可以另外指定)可能对您尝试读取的文件具有不同的访问权限。

答案3

在 的特定情况下cat,打印文件与使用或sth一样有效,因为该命令设计为打印作为命令行参数给出的所有文件(情况:将接收字符串作为参数,并将打开文件)或,如果没有给出文件,则打印标准输入(这种情况:shell 将通过打开并将其连接到的标准输入来遵循重定向)。cat sthcat <sthcatcat sthcatsthcat <sthsthcat

因此,两种情况下相同的行为特定于cat;对于设计为仅接受标准输入或命令行参数之一的命令,它可能根本不起作用。在其他情况下,行为可能略有不同,因为当通过标准输入获取数据时,命令可能无法访问文件名;比较:

$ grep -H foo sth
sth:foo

$ grep -H foo <sth
(standard input):foo

相关内容