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)
有哪些情况我可以或应该使用一个而不是另一个?
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,tail和shuf给出一个真实的,可搜索的文件句柄时,而不是一个FIFO能够更高效地运行.
始终直接从文件中使用重定向而不是cat" 使用该文件",除非您有特定且令人信服的理由不这样做.
作为这种令人信服的理由(您可能想要使用的地方cat)的一个示例,请考虑您需要流式传输仅由更多特权用户帐户读取的文件的情况.
sudo -u someuser /bin/cat -- /path/to/somefile | somecmd
Run Code Online (Sandbox Code Playgroud)
...允许somecmd使用原始的非升级权限运行,因此/etc/sudoers可以配置为允许原始命令仅运行该单个特定cat调用.
| 归档时间: |
|
| 查看次数: |
120 次 |
| 最近记录: |