GNU/Linux >> Linux の 問題 >  >> Linux

ループはバックグラウンドのサブシェルからの変数変換を無視しますか?

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."

待つ バックグラウンドプロセスが終了するのを待ちます。


Linux
  1. Linux –パーティションの数をSda1からSda2に変更しますか?

  2. エコーコマンドでフォントを変更しますか?

  3. CentOS/RHEL 8 でデフォルトのカーネル (古いカーネルから起動) を変更する方法

  1. パイプからシェル変数に値を読み込む

  2. Bash変数の文字数をカウントするにはどうすればよいですか

  3. スクリプト内の bash シェル スクリプトおよび関数の変数スコープ

  1. 遅れてバックグラウンドでコマンドを実行する方法は?

  2. tmux 内からデフォルトの新しいウィンドウ ディレクトリを変更する方法

  3. ssh ログインでクライアントから motd が出力されないようにしますか?