したがって、シェル間で環境変数を共有し、グローバル変数と同様に、すべてのシェルが変数の変更をすぐに認識できるようにする必要があります。ただし、マスターPIDに関連付ける必要があるため、2つのシェルスクリプトを実行できます。それぞれは同じグローバル変数名を持つマスターであり、その子孫はマスターPIDに関連する変数のみを変更します。
bash
スクリプトの作成に使用します。
現在の研究には以下が含まれます。
基準寸法
モジュールプロジェクトを使用してこれを達成できることを読んだ。http://modules.sourceforge.net/ところで、こうやろうとするのに悩みが多すぎて例が不足しているようですね。そして、「モジュール」はあまりにも一般的な単語なので、他の単語と混ざりすぎてグーグルするのは難しいです...数週間後も私の手はまだ空です。
単純なテキストソースファイルflock
また、同時書き込みを防ぐために、変数を保存/更新/読み取るためのソーススクリプトファイルとして単純なテキストファイルを使用する必要があることも読みました。ただし、これを行うと、2つのシェルが同時に変数を変更するなど、いくつかの問題が発生する可能性があります。
または
シェルが「グローバル」変数を読み取った後、他のシェルがそれを読み取るまで値を保持することを知っています。その間、他のシェルもこれを変更できます。
おそらく、非常に高速な外部アプリケーションがこれらのストレージスペースを提供できます。環境変数をグローバル変数として使用しようとしていませんか?しかし、私の考えでは、SQLソリューションが遅すぎると思います...
答え1
(include コマンド) を使用すると、環境をファイルに書き込んで、別のインスタンスからexport -p
定期的に再読み込みできます..
しかし、ご存知のように、同時修正があれば結果は良くありません。
変更をすぐに伝播するには、変更export
を他のシェルに伝播する組み込み関数の周りにラッパーを使用する必要があります。 Linuxではこのユーティリティを使用できますflock
。
global_export () {
{
flock 0
. /path/to/env
[ $# -eq 0 ] || export "$@"
export -p >/path/to/env
} </path/to/env
}
global_export
エクスポートした変数に新しい値を割り当てるたびに、この呼び出しを呼び出す必要があります。
これはかなり不器用なことだ。おそらく問題を解決するより良い方法があります。最も明白な方法は、これらの環境変数を使用するコマンドに設定ファイルを読み取ることです。
答え2
Gilesの答えを使用する代わりに、flock
次のことを行います。
ファイルを再ロードするには、シグナルハンドラを登録してください。
reload_env() {
flock -s 3
. /path/to/env
flock -u 3
}
trap reload_env USR1
ファイルを作成してSIGUSR1
ファイルを再ロードするように指示する関数をすべてのシェルに送信します。
export_env() {
flock 3
export -p >/path/to/env
flock -u 3
fuser -k -USR1 /path/to/env
}
ファイルを開きますが、何もしません。これはfuser
、そのシェルに信号を送信できるようにするためです。
exec 3>>/path/to/env
順序が少し重要です。少なくとも、このexec ...
セクションはこのセクションの後に来なければなりませんtrap ...
。それ以外の場合は、ファイルを開き、シグナルfuser
ハンドラを登録する前にコールシグナルを受信できます。
注:コードは完全にテストされていませんが、原則は維持されます。
注2:このサンプルコードはbash用です。
答え3
fish
シェルで使用汎用範囲変数:
set -U var value
もちろん、これはfish
同じユーザーが実行しているシェルでのみ機能します。
バインディングしたい場合マスターPID、変数名に含める
set -U m${masterpid}var value
答え4
ksh93がオプションの場合は、共有ストレージから変数の値を取得したり、共有ストレージに保存したりするためのgetterおよびsetterルール関数を使用して目的を達成する方法が必要です。
他の便利なfish
汎用変数機能とは異なり、変数の単一名を維持しながら、ユースケースのいくつかのメカニズムによってプライマリPIDに関連付けられた一連のプロセスに値共有を制限するために実装にアクセスできます。