我正在尝试理解这两个类似命令之间的差异。
aa=$(foo | bar | head -1)
read aa < <(foo | bar | head -1)
- 我知道
<()
需要#!/bin/bash
,但这会使它变慢吗? - 它们创建相同数量的子shell吗?
- 它们需要相同数量的
bash
或sh
进程吗?
我想使用性能最佳的命令。
我正在尝试理解这两个类似命令之间的差异。
aa=$(foo | bar | head -1)
read aa < <(foo | bar | head -1)
<()
需要#!/bin/bash
,但这会使它变慢吗?bash
或sh
进程吗?我想使用性能最佳的命令。
lastpipe
,则每个管道元素都需要一个进程,加上一个替换的子shell和父进程。lastpipe
,管道的最后一个元素将在两种情况下执行exec
而不进行分叉,仍然需要相同数量的进程。/dev/fd/*
的系统上编译了shell,则shell将为进程替换创建命名管道。这可能会影响性能。$(<...)
)。在mksh和ksh93中,还有${ ;}
风格的命令替换,但每个shell实现都不同。在ksh93中,它可能会提高速度,也可能不会。在mksh中,可能不会。mksh不支持进程替换,zsh不支持(也没有模拟的方法)BASHPID
,因此我没有研究过。在Bash中,命令替换与进程替换本质上并没有更快的一方,但在read
的情况下,head
是多余的,因为您只需要读取一行。顺便说一句,总是使用head -n ...
---1
不具备可移植性。除非您希望shell篡改输入,否则不要使用没有-r
的read
。
bash -c 'time PIPELINE...'
read
内置函数从一个后台进程中读取。进程替换可以绕过由管道/命令替换创建的子shell。替换语法被FIFO或FD的名称所取代,并且其中的命令在后台运行。替换与参数扩展和命令替换同时进行。
请查看有关使用“tee”进行进程替换的信息。