2

バッシュとウィップテイルは初めてなので、無知を許してください。

for ループで var を割り当てると、Whiptail ダイアログの使用時に新しい値 20 が設定されません。なぜ何か提案はありますか?

andy="10"
{
    for ((i = 0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
    done
 } | whiptail --gauge "Please wait" 5 50 0 
# }
echo "My val $andy
4

2 に答える 2

3

パイプライン内のコマンド (つまり、 で区切られた一連のコマンド|) は常にサブシェルで実行されます。つまり、各コマンドには独自の変数環境があります。同じことが複合コマンド内のコマンドにも当てはまりますが、通常はサブシェルを作成せずにグループ化に使用できる(…)複合コマンドには当てはまりません。{…}

bashまたはではzsh、パイプラインの代わりにプロセス置換を使用してこの問題を解決できます。例えば:

andy="10"
for ((i=0 ; i <= 100 ; i+=50)); do
        andy="20"
        echo $i
        sleep 1
done > >(whiptail --gauge "Please wait" 6 50 0) 
echo "My val $andy

>(whiptail ...)実行するサブシェルが作成されwhiptailます。式全体が、このサブシェルの標準入力の名前に置き換えられます (Linux では のようなものになりますが/dev/fd/63、他の OS では FIFO になる可能性があります)。> >(...)標準出力をサブシェルの標準入力にリダイレクトします。1 つ目>は、通常の stdout リダイレクトです。

于 2014-06-20T19:49:11.437 に答える
1

内部のステートメント{}は通常、サブシェルでは実行されません。ただし、パイプ(|)を追加すると、サブシェルで実行されるようです。

へのパイプを削除するwhiptailと、 の更新値が表示されますandy

于 2014-06-20T19:21:59.953 に答える