別のボックスからローカルマシンにすべての「env」変数をインポートしたいと思います。 env変数をローカルボックスのenv_var.txtにコピーしました。私は以下を実行しました:
for i in `cat env_var.txt`; do export $i; done
ただし、これではすべての環境変数が正しく設定されていないようです。変更しました
do export $i
に
do echo $i
変数はすべて正常に表示されているようです。この問題の原因は何ですか。または、すべての環境変数をインポートする別の方法はありますか?
TL、DR:エクスポート
export -p >env_var.sh
とインポート
. env_var.sh
コードが機能するかどうかは、env_var.txt
の形式と、変数の名前と値に含まれる特殊文字(シェル構文で特別な意味を持つ文字)によって異なります。
`cat env_var.txt`
は、引用符で囲まれていないコマンド置換です。変数コマンドの置換を引用符で囲まないままにすると、「split + glob」演算子が適用されます。最初にIFS
変数の値の文字でコマンドの出力を分割し、次に各部分をファイル名のワイルドカードパターンとして解釈しますそして、いくつかのファイルに一致する各パターンを、一致するファイルの名前で置き換えます。結果は、for
ループが反復する単語のリストです。
引用符で囲まれていないコマンド置換が必要な場合はめったにありません。この場合、それは間違いなく必要なものではありません。ただし、ファイルの構文が次の場合は機能します。 env
の出力と変数の値に*?\[
または空白が含まれていない。
env_var.txt
がenv
の出力である場合、意味のない構文解析メソッドを使用するよりも、実際の構文(改行区切りの割り当て)に従って構文解析すると、より良い結果が得られます。 。これを行う最も簡単な方法であるsplit + glob演算子を使用する場合は、IFS
を改行のみに設定し、ワイルドカード照合をオフにします。
set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS
ただし、受信側では解決できない問題があり、env
の出力があいまいです。次の内容を考えると:
foo=bar
hello=world
2つの変数(値がfoo
のbar
と呼ばれるものと、値hello
のworld
と呼ばれるもの)があるか、または1つだけあるかを判断する方法はありません。これはfoo
と呼ばれ、値は
bar
hello=world
環境変数を明確な方法でエクスポートするには、env
を使用しないでください。代わりにexport
を使用してください。コマンドexport -p
は、シェルが解析できる方法ですべての環境変数の値を一覧表示します。エクスポート側で実行します
export -p >env_var.sh
インポート側で実行
. env_var.sh
警告:bashでは、export -p
の出力は解析可能ですが、bashによってのみ可能です。他のshスタイルのシェルで機能する出力を取得するには、POSIXLY_CORRECT
を任意の値に設定します。これは他のシェルに悪影響を与えないので、あなたはただ行うことができます
(POSIXLY_CORRECT=$POSIXLY_CORRECT; export -p) >env_var.sh
POSIXLY_CORRECT
を以前の値に設定しても、出力に違いはありません。これは、環境に存在せず、これを実行した後でもないか、または環境とその値に存在します変わりません。ただし、export
を使用したbash固有の構文ではなく、export -p
の出力でdeclare
を使用した移植可能な構文をbashに使用させるだけで十分です。
環境変数をインポートすると、任意のコードが実行される可能性があるため、信頼できるソースからのみenv_var.txt
またはenv_var.sh
をインポートするようにしてください。原因は環境変数であり、. env_var.sh
がコードを実行するという事実ではありません。PATH
、LD_PRELOAD
、ENV
などの変数をインポートするだけで、コードの実行はさらに進んでいきます。
その方法でbash "source"コマンドを使用します。
source env_var.txt
すべての変数をインポートする必要があります。