デフォルトのPIDに関連するグローバル変数などのシェル間で環境変数を共有する方法は?

デフォルトのPIDに関連するグローバル変数などのシェル間で環境変数を共有する方法は?

したがって、シェル間で環境変数を共有し、グローバル変数と同様に、すべてのシェルが変数の変更をすぐに認識できるようにする必要があります。ただし、マスター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ルール関数を使用して目的を達成する方法が必要です。

バラよりhttps://stackoverflow.com/questions/13726293/environment-variables-to-be-used-across-multiple-korn-ksh93-shell-scripts-get詳細

他の便利なfish汎用変数機能とは異なり、変数の単一名を維持しながら、ユースケースのいくつかのメカニズムによってプライマリPIDに関連付けられた一連のプロセスに値共有を制限するために実装にアクセスできます。

関連情報