Bash - 管道到变量和文件

时间:2017-03-07 18:53:47

标签: bash tee

在下面的简化示例中,"任何"正确回应了$ 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=

有什么想法吗?

1 个答案:

答案 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