タイトルが示すように、私は子プロセス(通常はスクリプト)で親プロセス(特にシェル)の環境変数を変更できるようにしたいです。疑似端末のサブスクリプトからエクスポートしようとしているので、エクスポートした/dev/pts/id
変数key=value
を何らかの方法で親スクリプトに渡す必要がありますか(可能であれば)。
エコーはcmd > /proc/$$/fd/0
実行されず、サブシェルで実行するのではなく、シェルターミナルcmd
エミュレータでコマンドを表示するだけで、親プロセスに変数を追加しません。$(cmd)
cmd
export
私はすべての作業が子側で行われることを好みます。
誰かがコメントで私に尋ねました。私が達成したいことは何ですか?これは一般的な質問であり、ユーザーが追加の操作なしで追加された変数の利点を享受できるように、(親)シェルで実行(生成)されたスクリプトに変数を渡すために肯定的な答えを使用しようとしています。たとえば、アプリケーションをインストールするスクリプトが必要な場合は、アプリケーションディレクトリを親シェルパスに追加する必要があります。
答え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)