将输出传递给其他命令时,使用cat会产生问题吗?

时间:2011-03-24 17:40:37

标签: bash

在bash中,有多种方法可以直接输入和输出。例如,这些命令执行相同的操作:

sort <input_file >output_file
cat input_file | sort >output_file

一般来说,我更喜欢第二种方式,因为我更喜欢我的命令从左到右阅读。

this question的回答是:

  

“sort”可以使用临时文件来处理大于内存的输入文件

这让我想知道,在对大文件进行排序时,如果cat会使该过程短路。

将输出传递给其他命令时,是否可以使用cat创建问题?

3 个答案:

答案 0 :(得分:3)

有一个术语我扔了很多叫Useless Use of Cat (UUoC)而第二个选项就是这个。当实用程序可以使用重定向对STDIN(例如sort)进行输入时,不仅可以节省对cat等外部进程的额外调用,还可以防止管道的开销。

除了额外的流程和管道之外,我看到的唯一其他“问题”就是管道缓冲。

更新

显然,甚至还有一个致力于发布UUoC Award

的网站

答案 1 :(得分:2)

“我更喜欢我的命令从左到右阅读”

<input_file sort >output_file

(写这个的规范方式当然是sort input_file >output_file。)

答案 2 :(得分:2)

'sort'命令处理大文件,无论输入是通过标准输入和管道或I / O重定向到达,还是直接在命令行上命名。

请注意,您可以(也可能应该)写:

sort -o output_file input_file

即使输入和输出文件相同(或者如果您有多个输入文件,其中一个也是输出文件),这将正常工作。

我看到SiegeX已经把你带到虐待猫科动物虐待的任务,因为它也是众所周知的。我会支持他的努力。有时候使用cat是合适的。适合的时间少于经常被认可的次数。

适当使用的一个示例是使用tr命令和多个数据源:

cat "$@" | tr ...

这是必要的,因为tr只读取其标准输入,只写入其标准输出 - 最终的'纯过滤'程序。

Unix的作者也注意到了'cat inputs |的通用目的使用命令'construct而不是更专业的输入重定向(引用缺失 - 手头不需要书籍)。