コマンドmy_command
の出力が次の場合:
VAR1=some_value
VAR2=other_value
環境変数として保存されるようにmy_command
シェルスクリプトから呼び出すことはできますか?VAR1
VAR2
私は次のことを試しましたが、そのうち何も動作しませんでした。
#!/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)"
ため、実際には役に立ちません。export
VAR1=some_value\nVAR2=other_value
VAR1
異なるスクリプトで変数を異なる方法で実行または設定すると、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
まったく実行しないでください。