変数をエクスポートすることで、子プロセスで親の情報を読み取ることができることを知っています
myVariable=1
bash
echo $myVariable
exit
export myVariable=1
bash
echo $myVariable # 1
親から子プロセスで定義された変数にアクセスするにはどうすればよいですか?
bash
a=2
suspend
echo $a
あなたはこれを行うことはできません。
新しいシェルを開始すると、それは無関係のプロセスであり、親はシェルの「内部を調べて」メモリに何があるかを確認できません(これは一種のセキュリティ境界です)。その変数は共有されず、他の誰かが見ることができる場所に公開されません。
既存の環境変数のコピーを取得しますが、それらに加えた変更は、それ自体とその子のためのものです。シェルが終了するまで「逆方向」の通信はありません。その時点で存在するのは、単一の終了コードだけです。
あなたが示したようにこれをインタラクティブに行うとき、それは話の終わりです。最善の策は、データをファイルに保存し、そのファイルをsource
親から読み取ったり、親に戻したりすることです。本当にファイルを使用できない場合は、最後にそれを行うためのひどい方法がありますが、達成しようとしていることを再考することをお勧めします-これを正常に機能させることができれば素晴らしいでしょう(そして他のいくつかのシェルには共有変数があります!)、ここでは達成できません。
あなたは、非対話の一部またはすべてを実行するプログラムまたはシェルスクリプトを作っている場合はsource
、eval
とに述べたように、標準出力にデータをプリントアウトすると、あなたを助けるかもしれない既存の答え。子シェルを終了する場合は、1バイトの情報を終了コードに戻すexit 123
ことができます$?
。これは親で読み取ることができます。
本当に何かを移行する必要がある場合は、中間ファイルなしでインタラクティブにそれを実現するための非常に厄介なハックがあります。
$ bash
$ export a=2
$ sleep 60 & echo $!
2198
$ suspend
$ xargs -0 < /proc/2198/environ printf '%s\n' | grep '^a='
a=2
$ a=$(xargs -0 < /proc/2198/environ printf '%s\n' | grep '^a=' | cut -d= -f2-)
$ echo $a
2
$ [1]+ Done sleep 60
ここには重大な制限があります。特に、環境全体を制御していない場合は、環境変数値内の改行によって、たとえば、不要な値を設定するように仕向けられる可能性があります。
これa
は、サブプロセスの環境に表示されるようにエクスポートしてからsleep 60
、バックグラウンド(&
)で、sleep
出力された(echo $!
)のPIDを使用してサブプロセス(ここ)を起動することで機能します。内部シェルを一時停止すると、親から指定されたsleep
プロセスの環境変数を外部から読み取ることができます(これらは/proc
ファイルシステムで公開されています)が、nullバイトで区切られているため、xargs -0
分割してprintf '%s\n'
1行に1つずつ出力します。その時点で、変数の完全なリストがあり、必要な変数を選択できgrep
ます。オプションで、=
withの後に値だけを切り取ってcut
設定します。sleep
(私たちは転写の終了時に見るものである、独自に終了します[1]+ Done ...
)。
a
子のへの変更を取得したい場合は、すべてをやり直す必要があります。子はa
、親で行った変更を確認することはありません。私たちが行ったのは、別のコピーを作成することだけです。sleep
プロセスの理由は、プロセスのインバウンド環境変数のみが表示され、エクスポートされた場合でもシェルの内部変数値は表示されないためです。
これを実行したり、信頼したりすることはお勧めしません。使用する価値はありませんが、本当に必要な状況に陥った場合は、機能するはずです。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加