`cat |`和`<`之间有什么区别?

Ash*_*orf 2 unix linux bash pipe io-redirection

我想发送的内容filename,以some_cmd在命令行上.运行这个有什么区别:

$ cat filename | some_cmd
Run Code Online (Sandbox Code Playgroud)

$ some_cmd < filename
Run Code Online (Sandbox Code Playgroud)

有哪些情况我可以或应该使用一个而不是另一个?

Cha*_*ffy 7

  • cat foo | somecmd正在运行两个程序/bin/cat- 和somecmd; 并使用FIFO 将stdout连接cat到stdin somecmd,从开始到结束只能读取一次.该FIFO也不会公开有关原始文件的元数据 - 它的名称和大小都不能被发现somecmd(没有,对于大小,一直读到最后;这使得cat foo | tail多GB文件的速度非常慢).

  • somecmd <foo只运行一个程序somecmd- 将其stdin连接到文件的直接句柄foo.因此,它可以复制该句柄,倒回并重新读取它,将文件的子集分发给不同的线程以并行处理,将文件映射到内存中以便随机访问等.

常见的程序,如GNU sort,wc -c,tailshuf给出一个真实的,可搜索的文件句柄时,而不是一个FIFO能够更高效地运行.

始终直接从文件中使用重定向而不是cat" 使用该文件",除非您有特定且令人信服的理由不这样做.


作为这种令人信服的理由(您可能想要使用的地方cat)的一个示例,请考虑您需要流式传输仅由更多特权用户帐户读取的文件的情况.

sudo -u someuser /bin/cat -- /path/to/somefile | somecmd
Run Code Online (Sandbox Code Playgroud)

...允许somecmd使用原始的非升级权限运行,因此/etc/sudoers可以配置为允许原始命令仅运行该单个特定cat调用.