Bash - 管道到变量和文件

Bash - pipe to variable and file

在下面的简化示例中,"anything" 正确地从 $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=

有什么想法吗?

read必须在当前shell执行;你需要反转你的管道。

read S < <(echo anything | tee >(gzip - > S.gz))

或者,在 bash 4.2 或更高版本中,使用 lastpipe 选项。 (请注意,作业控制必须处于非活动状态才能使 lastpipe 生效。它在非交互式 shell 中默认关闭,并且可以在交互式 shell 中使用 set +m.)

shopt -s lastpipe
echo anything | tee >(gzip - > S.gz) | read S