cat |`和`<`有什么区别

时间:2018-10-17 19:35:10

标签: linux bash unix pipe io-redirection

我想在命令行上将filename的内容发送到some_cmd。运行此命令有什么区别?

$ cat filename | some_cmd

$ some_cmd < filename

在某些情况下,我可以使用或应该使用一种而不使用另一种吗?

1 个答案:

答案 0 :(得分:7)

  • cat foo | somecmd正在运行两个程序-/bin/catsomecmd;并使用FIFO将cat的stdout连接到somecmd的stdin,从头到尾只能读取一次。该FIFO也不会公开有关原始文件的元数据-somecmd都无法发现其名称和大小(对于大小,如果没有读取,则一直读到最后;这使cat foo | tail荒唐可笑。数GB的文件速度较慢)。

  • somecmd <foo仅运行一个程序somecmd,并将其stdin连接到文件foo上的直接句柄。因此,它可以复制该句柄,倒带和重读它,将文件的子集分发给不同的线程以并行处理,将文件映射到内存以进行随机访问等。

如果给定了真正可查找的文件句柄而不是FIFO,则GNU sortwc -ctailshuf之类的通用程序可以更高效地运行。

始终直接使用文件中的重定向,而不用cat对该文件进行重定向,除非您有特殊且令人信服的理由要这样做。


作为一个令人信服的原因的示例(您可能要使用cat),请考虑以下情况:您需要流式传输只有特权更大的用户帐户才能读取的文件。

sudo -u someuser /bin/cat -- /path/to/somefile | somecmd

...让somecmd以您未升级的原始特权运行,因此可以配置/etc/sudoers以允许原始命令仅运行单个特定的cat调用。