私が持っていると仮定しましょう
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
。スタートそのファイルから読み取った値。
さらに一歩進むことができます。~/.myvar
formatを使用しMYVAR=200
てからsetを使用するPROMPT_COMMAND=source ~/.myvar
と、新しいプロンプトが表示されるたびに値が再度読み取られます。まだではないかなり共有グローバル変数ですが、実際のように動作し始めます。ただし、プロンプトが返されるまでアクティブではなく、これを実行する操作によっては深刻な制限が発生する可能性があります。
そしてもちろん、次の作業は自動的に行われます。書く環境変数は実際にはシェル間の通信メカニズムで~/.myvar
はなく、他の方法を見つける方が良いので、ここで停止します。
答え2
答え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で書かれています。
とにかく、この答えを可能な解決策として追加してください。