3

根据 bash(1) 手册页,当我运行以下命令时:

set -e
x=2
echo Start $x
while [ $((x--)) -gt 0 ]; do echo Loop $x; done | cat
echo End $x

输出将是:

Start 2
Loop 1
Loop 0
End 2

在循环之后(作为子外壳运行)变量 x 重置为 2。但是如果我删除管道 x 将被更新:

Start 2
Loop 1
Loop 0
End -1

我需要更改 x 但是,我也需要管道。知道如何解决这个问题吗?

4

1 回答 1

3

bashalways(至少从 4.2 开始)在子 shell 中运行管道的所有非最右边部分。如果调用 shell 中的值x需要更改,则必须重写代码以避免管道。

一个看起来很可怕的例子:

# If you commit to one bash feature, may as well commit to them all:
#   Arithmetic compound: (( x-- > 0 ))
#   Process substitution: > >( cat )
while (( x-- > 0 )); do echo Loop $x; done > >( cat )
于 2013-06-04T15:05:21.213 回答