until
を含むスクリプトを作成しました ループ。このループは、ブール変数が true
に設定されるまで実行する必要があります ループの外側から。残念ながら、ループは変数がtrueに設定されていることを無視し、実行を続けます。この問題を引き起こすいくつかの行を次に示します。
boolean=false
{ sleep 5 && boolean=true && echo "boolean is true now" ; } &
{ until [ "$boolean" = true ] ; do sleep 1 && echo $boolean ; done ; } &&
echo "boolean is true now: $boolean"
これが生成する出力は次のとおりです。
false
false
false
false
boolean is true now
false
false
false
...
boolean
のときにループを終了するにはどうすればよいですか? true
に設定されています ?
承認された回答:
&コード> キャラクターはバックグラウンドプロセスを作成します。バックグラウンドプロセスは、サブシェルで非同期に実行されます。変数は親シェルからサブシェルに渡すことができますが、その逆はできません。ただし、子シェルで設定された値が本当に必要な場合は、回避策を実行できます。
boolean=$(mktemp) && echo "false" >$boolean
{ sleep 5 && echo true >$boolean && echo "boolean is true now" ; } &
{ until [ "$(cat $boolean)" = "true" ] ; do sleep 1 && cat $boolean ; done ; } &&
echo "boolean is true now: $(cat $boolean)"
これにより、内容がブール値である一時ファイルが作成されます。 until
そのファイルがtrueを含むまでチェックされるループ。
注意:
スクリプトで次のことを行うことをお勧めします(可能な場合):
{ sleep 5 && echo "background process done" ; } &
wait
echo "continue in foregound."
待つコード> バックグラウンドプロセスが終了するのを待ちます。