/ /変更がwhileループに反映されるようにbashスクリプトのグローバル変数を外部から変更するにはどうすればよいですか? -Linux、bash、ubuntu

外部からbashスクリプトのグローバル変数を変更して、変更がwhileループに反映されるようにするには? - linux、bash、ubuntu

Ubuntuには、同じスクリプト内にある関数(私も書いた)をアクティブにし、次のようにバックグラウンドで実行するように設定するbashスクリプトがあります。

my script:
.
.
my_func &
do some stuff (that i don"t know how much time it"s gonna take)
global_var=1

my_funcはwhileループを持つ関数であり、その条件はwhileを実行することです

global_var -ne 1

しかし、それは機能しません。値がループの外側で1に変更された後、whileループが実行され続けるため、変更が関数に伝播しないようです。

my_funcはスクリプトのパフォーマンスに関する統計情報を収集するため、優雅に仕上げる必要があり、「プログラムの完了後に強制終了することはできません。だから」停止するように指示する必要があります。

停止するように指示する助けが必要です。

回答:

回答№1は0

この関数をバックグラウンドで実行すると、実行するスクリプトとアクセスまたはメモリを共有しません。他の方法を使用する必要があります。

最もエレガントな方法は、あなたができないかどうかを確認することです停止する必要があることを関数自体に理解させる。ただし、状況によってそれが不可能な場合、最も古く最も簡単な方法の1つは、スクリプト間で共通にする必要のある変数で満たされた共有データファイルを持つことです。

したがって、グローバル変数の代わりに、vars.txt、stopfunction = 1に書き込みます バックグラウンドスクリプトでは、各ループを常にこのファイル(またはデータベース)でチェックして、変数を確認します。

あるいは、プログラムでこの形式が許可されている場合は、データをエクスポートできる場合があります。関数を別のシェルスクリプトに入れて、バックグラウンドで最初から実行します。

#!/bin/sh

globalvar="something"
export globalvar
./2.sh &

echo "finished"

そして2.shで

#!/bin/sh

sleep 5
echo "this is global: $globalvar"

たとえば、これがあなたのケースで機能するかどうかはわかりませんが、iveは、あなたがしようとしているように聞こえるようなスクリプトのために同様のトリックを使用しました。

ただし、この方法では、グローバル変数の変更とスクリプトの呼び出しが、たとえ非同期であっても、何らかの大きなループになる必要があります。