web-dev-qa-db-ja.com

Linuxサブシェルから特定の環境変数をキャプチャします

スクリプトAからシェルスクリプトBを実行し、スクリプトBで変数を設定またはエクスポートし、スクリプトBが終了してそのサブシェルが戻った後、その値をスクリプトAに格納できるようにする方法を見つけようとしています。

スクリプトBをソースしようとはしていません。特定の変数が1つだけ必要です。スクリプトAに何かを追加することはできますが、スクリプトBに設定されている可能性のある変数が、特にキャプチャしようとしているもの以外に、スクリプトAの変数を上書きしたくありません。

Aで気になるすべての変数をファイル、ソーススクリプトBに書き出し、ファイルからすべてを読み戻し、Bで設定された変数に加えて、Aで変数を復元するなど、いくつかの醜い方法があると確信しています私が欲しいこと。比較的クリーンでわかりやすい方法があれば、それを探しています。

1
NerdPirate

この他の答え 良いです、特にあなたのBスクリプトが1つのことをしてそれをうまくやるなら( nix哲学 を参照)そしてこの「1つのこと」はあなたの最初の選択であるべきです「この特定の変数値を計算する」ことを意味します。

しかし、Bの主な目的が何か他のものを印刷することである場合はどうなるでしょうか?またはユーザーと対話することさえできますか? stdoutを介してadditionalデータを渡すには、取得した結果をさらに解析する必要があります。もしそうなら、BとAの間の完全に独立した通信チャネルが強く望まれます。あなたの場合、一方向のコミュニケーションで十分です。

実際、一時ファイルは非常に適しています。しかし、あなたが言うとき

aで気になるすべての変数をファイルに書き出すなどの醜い方法、ソーススクリプトB、ファイルからすべてを読み戻し、必要なBに設定された変数に加えて、Aの変数を復元します。

あなたは状況をひっくり返しています、そしてそれは確かに醜いです。正しい方法は、ファイルを使用して、この1つの目的の変数のみを渡すことです。

Aの場合:

_tmpf_foo=$(mktemp)
_

次に、コマンドライン引数として_"$tmpf_foo"_を指定してBを呼び出し、Bの_"$1"_(または設計によっては別の番号)でファイルを参照します。 Bがすでにコマンドライン引数を解析している場合、これは便利ではない可能性があります。

別の方法は、Aで_export tmpf_foo_を実行し、ファイルをBで_"$tmpf_foo"_として参照することです。

BがA内だけでなく使用できる汎用ツールである場合は、ファイルに書き込む前に、ファイルが存在するかどうかを(Bで)確認することをお勧めします(例:_if [ -f "$tmpf_foo" ]; then …_)。

とにかく、Bではファイルに希望の値を書き込みます。例えば。ファイルの内容は次のようになります。

_12345
_

Bが正常に終了した後、Aで次のような値を取得します。

_specificvariable=$(<"$tmpf_foo")
_

specificvariable=$(cat "$tmpf_foo")と同等ですが、catはありませんが、移植性はありません)。

BからAに複数の変数を渡す必要がある場合は、複数の行を使用して、それらを(Aで)readで読み取ることができます。ただし、どの変数を変更する必要があるか(または変更する必要がある場合)が事前にわからない場合は、Bにファイル内に行を作成させて次のようにします。

_specificvariable=12345
othervariable="xyz 0"
bar=baz
unset var1
_

Bが正常に終了したら、Aでファイルをソースします。

_. "$tmpf_foo"
_

この方法でanyコマンドを渡すことができ(上記の例ではunsetはコマンドです)、A内から実行されることに注意してください。このため、B内からファイルに書き込むときは十分に注意し、他の(不正な)プロセスがファイルに文字列を挿入できないようにする必要があります。

最後に(Aで)_rm "$tmpf_foo"_を使用して一時ファイルを削除します。

4

その特定の変数をstdoutに書き込み、次にAに書き込みます。

specificvariable=$(/path/to/B.sh)
5
Ipor Sircer