在下面的简化示例中,"任何"正确回应了$ S"变成" S.gz"文件。但是,变量会从管道流中丢失其值:
echo 'anything' | tee >(read S | gzip >S.gz)
zcat S.gz
echo '$S='"$S"
它回应:
anything
$S=
预期输出为:
anything
$S=anything
另一种方式,同样不幸的输出:
echo 'anything' | tee >(read S) | gzip >S.gz
zcat S.gz
echo '$S='"$S"
它回应:
anything
$S=
有什么想法吗?
答案 0 :(得分:2)
read
必须在当前shell中执行;你需要反转你的管道。
read S < <(echo anything | tee >(gzip - > S.gz))
或,在bash
4.2或更高版本中,使用lastpipe
选项。 (请注意,作业控制必须处于非活动状态才能使lastpipe
生效。默认情况下,它在非交互式shell中处于关闭状态,并且可以在set +m
的交互式shell中关闭。)
shopt -s lastpipe
echo anything | tee >(gzip - > S.gz) | read S