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
在下面的简化示例中,"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