大多数情况下,当我看到有人在Bash脚本中建议使用管道时,总会有人指出不要使用它,而是仅使用一个命令。
例如:
例如:
find $dir -name $pattern
替代
ls $dir | grep $pattern
除了外观,还有其他原因避免使用管道吗?
管道本身并没有问题。应该避免的是无用的fork()
,这意味着启动一个进程是一件相对耗时的事情。
如果某个操作可以在一个进程中完成,通常比使用两个进程获得相同的结果更好。
exec
比 fork
更昂贵。有人有数据吗? - W.Mann因为管道会创建一个新的进程。在你的例子中,ls和grep是两个进程,find是一个进程。一个或多个管道会使命令变慢。以下是一个简单的例子:
$ time find Downloads -name *.pdf &>/dev/null
real 0m0.019s
user 0m0.012s
sys 0m0.004s
$ time ls Downloads | grep pdf &>/dev/null
real 0m0.021s
user 0m0.012s
sys 0m0.004s
ls
还按字母顺序对输出进行排序,而find
仅使用底层系统命令返回的顺序。此外,正如已经指出的那样,find
是递归的。 - W.Mannls
命令,而不是grep
命令。 - marcolzbash
的 time
内建命令中,就是这个情况。 - marcolz
ls
的输出:http://mywiki.wooledge.org/ParsingLs - ymonad