ユーザー空間で子項目から親項目に環境変数を渡すことはできますか? [コピー]

ユーザー空間で子項目から親項目に環境変数を渡すことはできますか? [コピー]

タイトルが示すように、私は子プロセス(通常はスクリプト)で親プロセス(特にシェル)の環境変数を変更できるようにしたいです。疑似端末のサブスクリプトからエクスポートしようとしているので、エクスポートした/dev/pts/id変数key=valueを何らかの方法で親スクリプトに渡す必要がありますか(可能であれば)。

エコーはcmd > /proc/$$/fd/0実行されず、サブシェルで実行するのではなく、シェルターミナルcmdエミュレータでコマンドを表示するだけで、親プロセスに変数を追加しません。$(cmd)cmdexport

  1. 私はすべての作業が子側で行われることを好みます。

  2. 誰かがコメントで私に尋ねました。私が達成したいことは何ですか?これは一般的な質問であり、ユーザーが追加の操作なしで追加された変数の利点を享受できるように、(親)シェルで実行(生成)されたスクリプトに変数を渡すために肯定的な答えを使用しようとしています。たとえば、アプリケーションをインストールするスクリプトが必要な場合は、アプリケーションディレクトリを親シェルパスに追加する必要があります。

答え1

いいえ、それは不可能です。

いくつかなければそうではありません。解決策

環境変数は、親から子にのみ(環境のエクスポート/継承の一部として)渡すことができ、その逆の場合は不可能です。

答え2

ファイルまたは名前付きパイプを使用して、子プロセスから親プロセスに変数値を転送できます。

これは最も単純な理論的な例です。

サブプロセス:

echo ${variable} >/tmp/file

親プロセス:

read variable </tmp/file

答え3

親プロセスがそれを期待せずに協力しない場合、これは非常に難しいかもしれません。この場合は、以下を参照してください。実行中のプロセスの環境の変更 そして他のプロセスの環境変数を変更する方法はありますか?

親プロセスに値が必要で転送に協力する場合、簡単な方法はコマンド置換を使用することです。

出口VAR=$(ガイドライン)

これは、変数の値が次のようになると仮定します。ただプログラムが作成する内容。子プロセスが画面(特に親プロセスの標準出力)に書き込む必要がある場合は、親プロセスのファイルディスクリプタ1を他のファイルディスクリプタに隠してこれを実行できます。

exec 3>&1       # Copy our file descriptor 1 into file descriptor 3.
                # child_prog will be invoked with file descriptor 1 pointing to a pipe
                # for the command substitution, but all other file descriptors intact.
                # Specifically, fd3 will point to our stdout.
export var=$(child_prog)
exec 3>&-       # (Optionally) close fd3 as cleanup.

短くて簡単な場合は、child_prog最も簡単な方法は変数の値をファイルディスクリプタ1に書き込み、ファイルディスクリプタ3(cmd >&3)を標準出力として使用することです。規模が大きいか複雑な場合は、次のことをお勧めします。

exec 5>&1       # Redirect fd1 (the command substitution pipe) to fd5.
exec 1>&3       # Set our fd1 (stdout) to our parent's stdout (which was passed in as fd3).
exec 3>&-       # Close fd3; it’s no longer needed.

その後、stdoutが正常に使用され、値を書き込む>&5ために使用されます。

これまで、私は変数に値だけを渡したいと仮定してきました。複数の値がある場合は、どの値にも表示されないようにする文字(または文字列)で区切ります。私たちが選択した場合、@@両親は次のように話すことができます。

exec 3>&1
temp=$(child_prog)
exec 3>&-
export var1="${temp%%@@*}"
rest="${temp#*@@}"
export var2="${rest%%@@*}"
export var3="${rest#*@@}"

そして子供は話すことができます。echo "value1@@value2@@value3" >&5

どの値にも表示されないことが保証されている印刷文字列を見つけるのが難しい場合は、改行文字を使用できます。@@上記のコマンドを改行文字に変更してください。

親:

export var1="${temp%%
*}"
rest="${temp#*
}"
export var2="${rest%%
*}"
export var3="${rest#*
}"

子供:

printf "%s\n" "値1" "値2" "値3>&5


もう一つの変形は子供に餌を与えることです。注文する 価値観ではなく両親に戻ります。親プロセスと呼ばれる場合は、. <(child_prog)子プロセスを実行して出力をキャプチャします。そしてそれを実行。それから子供はできます。

printf "var1=' エクスポート値1'\nエクスポートvar2='値2'var3=\"値3\"\n" >&5

(私はこれをテストしました。value3アポストロフィが含まれているので、引用する必要があり、\"…\"代替構文を説明するためにそのままにしました。 )

この手法の1つの特徴は、親コードを変更せずにエクスポートする変数を追加できることです。

POSIXは 。<(cmd)

関連情報