为了证明它是生成子shell的管道本身,并且花括号不会改变这种方式:
#!/bin/bash
echo "Base: $BASHPID"
( echo "In (): $BASHPID" ) # This will differ from the base
{ echo "In {}: $BASHPID"; } # This will match the base
# In bash,these will both differ from the base
echo "Pipeline,default config:"
{ echo " X: $BASHPID" >&2; } | { echo " Y: $BASHPID" >&2; }
# This is exactly the same without the {}s
echo "Pipeline,no {}s,default config:"
echo " X: $BASHPID" >&2 | echo " Y: $BASHPID" >&2
# Only the former will differ from the base if running a new enough bash
shopt -s lastpipe
echo "Pipeline,lastpipe enabled:"
{ echo " X: $BASHPID" >&2; } | { echo " Y: $BASHPID" >&2; }
使用bash 4.3在本地运行,我得到:
Base: 82811
In (): 82812
In {}: 82811
Pipeline,default config:
X: 82813
Y: 82814
Pipeline,default config:
X: 82815
Y: 82816
Pipeline,lastpipe enabled:
Y: 82811
X: 82817
请注意,由于所有管道组件同时运行,因此没有定义的排序,其中X或Y将首先发出输出;但是,在启用了lastpipe的情况下,最后一个管道组件在已经启动并运行的shell中调用(不需要从主进程中删除fork()),这稍微修改了谁首先写入stdout的可能性.