我想在命令行上将filename
的内容发送到some_cmd
。运行此命令有什么区别?
$ cat filename | some_cmd
和
$ some_cmd < filename
在某些情况下,我可以使用或应该使用一种而不使用另一种吗?
答案 0 :(得分:7)
cat foo | somecmd
正在运行两个程序-/bin/cat
和somecmd
;并使用FIFO将cat
的stdout连接到somecmd
的stdin,从头到尾只能读取一次。该FIFO也不会公开有关原始文件的元数据-somecmd
都无法发现其名称和大小(对于大小,如果没有读取,则一直读到最后;这使cat foo | tail
荒唐可笑。数GB的文件速度较慢)。
somecmd <foo
仅运行一个程序somecmd
,并将其stdin连接到文件foo
上的直接句柄。因此,它可以复制该句柄,倒带和重读它,将文件的子集分发给不同的线程以并行处理,将文件映射到内存以进行随机访问等。
如果给定了真正可查找的文件句柄而不是FIFO,则GNU sort
,wc -c
,tail
和shuf
之类的通用程序可以更高效地运行。
始终直接使用文件中的重定向,而不用cat
对该文件进行重定向,除非您有特殊且令人信服的理由要这样做。
作为一个令人信服的原因的示例(您可能要使用cat
),请考虑以下情况:您需要流式传输只有特权更大的用户帐户才能读取的文件。
sudo -u someuser /bin/cat -- /path/to/somefile | somecmd
...让somecmd
以您未升级的原始特权运行,因此可以配置/etc/sudoers
以允许原始命令仅运行单个特定的cat
调用。