【问题标题】:What is the difference between `cat |` and `<``cat |` 和 `<` 有什么区别
【发布时间】:2019-03-22 13:48:45
【问题描述】:

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

$ cat filename | some_cmd

$ some_cmd < filename

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

【问题讨论】:

  • 首先,您正在创建两个进程,它们之间有一个管道。在第二种情况下,您只运行一个进程并且没有管道。在后者中,您可以预期 fseek(stdin,...) 会成功,但在前者中,您应该预期在 stdin 上搜索会失败。
  • Useless use of cat?的可能重复
  • @xhienne, ...如果那里的答案没有受到受欢迎程度而不是正确性的严重影响...
  • @CharlesDuffy 我不同意那里的每一个观点,但至少它可能最好地回答 Ashton 的问题“在某些情况下我可以使用一种而不是另一种吗?”
  • @xhienne 感谢您指出这个问题。我认为它有一些有用的信息。但是,我不是在问cat 何时“无用地使用”——我问的是这两种方法之间的区别以及何时使用其中一种方法是合适的。 (请参阅我更新的问题。)@CharlesDuffy 的回答指出了这一点。另一个问题没有完全回答我的问题。

标签: linux bash unix pipe io-redirection


【解决方案1】:
  • cat foo | somecmd 正在运行两个程序——/bin/catsomecmd;并使用 FIFO 将cat 的标准输出连接到somecmd 的标准输入——从头到尾只能读取一次。该 FIFO 也不会公开有关原始文件的元数据 - somecmd 无法发现其名称和大小(对于大小而言,没有一直读取到最后;这使得 cat foo | tail 对于多-GB 文件)。

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

GNU sortwc -ctailshuf 等常见程序在提供真实的、可查找的文件句柄而不是 FIFO 时可以更高效地运行。

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


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

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

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

猜你喜欢
  • 2015-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-16
  • 2019-06-19
  • 2012-09-28
相关资源
最近更新 更多