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 以降) は、パイプラインの右端以外のすべての部分をサブシェルで実行します。呼び出しシェルで値xを変更する必要がある場合は、コードを書き直してパイプラインを回避する必要があります。

恐ろしい例の1つ:

# 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 に答える