すべてのサブシェルで使用可能および変更できるように環境変数をエクスポートしますか?

すべてのサブシェルで使用可能および変更できるように環境変数をエクスポートしますか?

私が持っていると仮定しましょう

export MY_VAR=0

存在する~/.bashrc

GNOME端末が開いていて、この端末で$MY_VAR値を200

echo $MY_VAR

この端末で200表示します。

これで、GNOME端末で別のタブを開いて実行しました。

echo $MY_VAR

...代わりに200私は持っています0

端末が環境変数を変更するときに、この修正(200に設定)がすべての後続のサブシェルなどで使用できるように200値を維持するにはどうすればよいですか?可能ですか?

答え1

コピー環境はサブシェルに伝播されるため、次のように動作します。

$ export MY_VAR=200
$ bash
$ echo $MY_VAR
200

ただし、コピーなので、その値を親シェルに渡すことはできません。少なくとも環境を変更する方法では不可能です。

実際には、さらに一歩進んで、Gnome端末の新しいタブなど、親シェルとは別に実行される「兄弟」シェルが共有するグローバル変数のようなものを作成したいようです。

ほとんどの場合、答えは「環境変数がそのように動作しないためできません」です。しかし、別の答えがあります。つまり、いつでも何かをハッキングできるということです。 1つの方法は、変数の値をファイル(たとえば)に書き込ん~/.myvarだ後にそれを含めることです~/.bashrcスタートそのファイルから読み取った値。

さらに一歩進むことができます。~/.myvarformatを使用しMYVAR=200てからsetを使用するPROMPT_COMMAND=source ~/.myvarと、新しいプロンプトが表示されるたびに値が再度読み取られます。まだではないかなり共有グローバル変数ですが、実際のように動作し始めます。ただし、プロンプトが返されるまでアクティブではなく、これを実行する操作によっては深刻な制限が発生する可能性があります。

そしてもちろん、次の作業は自動的に行われます。書く環境変数は実際にはシェル間の通信メカニズムで~/.myvarはなく、他の方法を見つける方が良いので、ここで停止します。

答え2

私がexport MY_VAR=0そこにいるとしましょう~/.bashrc

それはあなたの間違いです。~/.profileログイン時に読み込まれる環境変数をに定義する必要があります。~/.bashrcこの変数はシェルが起動するたびに読み取られ、内部シェルを起動すると上書きされますMY_VAR。そうしないと、環境変数が下に伝播します。

~/.bashrc対。の詳細について~/.profileより早い 郵便 存在する これ トピック

気づく戻る伝播(子シェルから変更された値を取得すると、自動的に親シェルに反映)は不可能で、完全に停止します。

答え3

魚の殻は、次のことができます。

set -U MY_VAR 0

(望むよりhttp://fishshell.com/docs/current/commands.html#set)

fish -c他のシェルでFishコマンドを実行するには、次のように実行できます。

fish -c "set -u MY_VAR 0"

答え4

この質問を検索したときに、サブシェルの外部で状態(シェル変数など)を更新する問題を解決しようとしました。このようにして、変数はパイプライン内に割り当てることができ、割り当ては親エントリに透過的に表示されます。

もちろん、パイプラインの一部は親シェルforkで実行され、次のメモリを持つサブシェルで実行されるため、これは簡単な方法では不可能です。書き込み中のコピー両親の思い出を確認してください。しかし、スリムで透明なソリューションが可能だと思います。共有メモリ「少し産業用コンピュータ

一つも見つけた実装するまさにこれはデザインです...しかし、Perlで書かれています。

とにかく、この答えを可能な解決策として追加してください。

関連情報