我希望将filename
的内容发送到命令行上的some_cmd
。这样做与运行以下命令有何不同:
$ cat filename | some_cmd
并且
$ some_cmd < filename
有没有情况下我可以或应该使用其中一个而不是另一个?
我希望将filename
的内容发送到命令行上的some_cmd
。这样做与运行以下命令有何不同:
$ cat filename | some_cmd
并且
$ some_cmd < filename
cat foo | somecmd
运行了两个程序——/bin/cat
和 somecmd
,并使用一个FIFO将cat
的stdout连接到somecmd
的stdin上,该FIFO只能从头到尾读取一次。该FIFO也不会显示有关原始文件的元数据,即somecmd
无法发现其名称或大小(对于大小而言,除非读取到末尾;这使得对于多GB文件,cat foo | tail
变得非常缓慢)。
somecmd <foo
只运行了一个程序——somecmd
,将其stdin连接到文件foo
的直接句柄上。因此,它可以复制该句柄,倒回和重新读取它,将文件的子集分配给不同的线程以并行处理,将文件映射到内存中以进行随机访问等操作。
常见的程序,如GNU sort
、wc -c
、tail
和shuf
在获得真正可寻址的文件句柄而不是FIFO时可以更加高效地运行。
始终直接从文件进行重定向,而不要使用cat
,除非您有特定且令人信服的理由。
作为这样一个令人信服的理由的示例(您可能需要使用cat
),考虑需要流式传输仅可由更高权限用户帐户读取的文件的情况。
sudo -u someuser /bin/cat -- /path/to/somefile | somecmd
...使用 somecmd
以您的原始非特权身份运行,因此可以配置/etc/sudoers
仅允许原始命令运行单个特定的cat
调用。
fseek(stdin,...)
成功,但在前者中,您应该期望在stdin上寻找失败。 - William Pursell