コマンド出力を環境変数として保存

コマンド出力を環境変数として保存

コマンドmy_commandの出力が次の場合:

VAR1=some_value
VAR2=other_value

環境変数として保存されるようにmy_commandシェルスクリプトから呼び出すことはできますか?VAR1VAR2

私は次のことを試しましたが、そのうち何も動作しませんでした。

#!/bin/bash
source my_command
export `my_command`

しかし、手動で入力すると

export `my_command`

ターミナルコンソールで2つの変数を保存します。

ベストアンサー1

このような状況が発生した場合my_command

#!/bin/sh
echo 'VAR1=some_value'
echo 'VAR2=other_value'

これを実行すると明らかに印刷されます

VAR1=some_value
VAR2=other_value

source my_commandそうです。走る現在、シェルのスクリプトはディストリビューションを出力としてのみ生成します。ジョブが印刷されずに直接実行されるsource場合に使用できます。my_command

export $(my_command)スクリプトの出力をインポートしてエクスポートに渡すと、変数は現在のシェル環境に保存されます。しかし、コマンド置換は引用符で囲まれていないため、関連変数にスペースやグローバル文字が含まれていない場合にのみ機能します。引用符を入れるのはパラメータとして扱われ設定されている"$(my_command)"ため、実際には役に立ちません。exportVAR1=some_value\nVAR2=other_valueVAR1

異なるスクリプトで変数を異なる方法で実行または設定すると、export $(my_command)その変数は親シェルに設定されません。対話型シェルで割り当てを実行するには、そこで実行する必要がありますが、source割り当てを実行する関数またはスクリプトから割り当てをラップできます。


確実な解決策はssh-agent、そうしてスクリプトがexport設定した変数を出力するコマンドを出力することです。それでは走れば十分ですeval "$(my_command)"

これを望まない場合は、set -aスクリプトの前にを使用して設定されたすべての変数をシェルに自動的にエクスポートさせることができます。

だから、

$ set -a
$ eval "$(my_command)"

Bashでは、declare -p()を使用して変数をエクスポートしたことを確認できます-x

$ declare -p VAR1 VAR2
declare -x VAR1="some_value"
declare -x VAR2="other_value"

ここでは、スクリプトは引用符eval付き文字列(例:)を出力し、VAR1="foo bar"正しく処理されます。割り当てだけでなく、evalスクリプト出力の他my_commandのすべても実行されますが、信頼できない場合はmy_commandまったく実行しないでください。

おすすめ記事