別のボックスのすべての "env"変数を私のローカルコンピュータにインポートしたいと思います。環境変数をローカルボックスのenv_var.txtにコピーしました。私は次のことをしました。
for i in `cat env_var.txt`; do export $i; done
しかし、これはすべての環境変数を正しく設定していないようです。すでに編集しています。
do export $i
入力する
do echo $i
そして変数はすべてが大丈夫だと思われます。この問題の原因は何ですか?それとも、すべての環境変数を取得する別の方法がありますか?
答え1
TL、DR:輸出
export -p >env_var.sh
そして収入
. env_var.sh
env_var.txt
コードが有効かどうかは、変数名と値の書式と特殊文字(つまり、シェル構文で特別な意味を持つ文字)によって異なります。
`cat env_var.txt`
引用符のないコマンドの置き換えです。引用符で囲まれていない変数コマンドの置き換えには、「split + glob」演算子が適用されます。まず、コマンドの出力を変数valueの文字に分割し、IFS
各部分をファイル名のワイルドカードパターンとして解釈し、一致する各パターンの一部のファイルを一致するファイルに置き換えます。名前。結果はfor
ループが繰り返される単語のリストです。
引用符のないコマンドの置き換えは、ユーザーが望むことはほとんどなく、この場合は確かに望むものではありません。ただし、ファイル構文が次の場合には機能します。env
変数の値には*?\[
スペースが含まれていません。。
env_var.txt
yesの場合env
、理解できない解析方法を使用する代わりに、実際の構文(改行で区切られた割り当て)に基づいて解析すると、より良い結果が得られます。最も簡単な方法である分割+グローブ演算子を使用するには、IFS
改行文字にのみ設定してワイルドカードの一致をオフにします。
set -f; IFS='
'
export `cat env_var.txt`
set +f; unset IFS
しかし、受信側では解決されない問題、すなわち出力がenv
不明であるという問題がある。以下を考慮すると:
foo=bar
hello=world
foo
2つの変数(1つは値として呼び出され、1つは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
には何の影響もありません。環境内になく、実行後に表示されないか、環境内にあり、その値は変更されません。しかし、これはbashがexport
出力でexport -p
bash固有の構文の代わりに移植可能な構文を使用するように強制するのに十分ですdeclare
。
環境変数をインポートすると任意のコードが実行される可能性があるため、env_var.txt
信頼できるソースからのみインポートまたはインポートしてください。原因はenv_var.sh
コードが実行されるという事実ではなく、環境変数です。単に、、などの変数を取得するだけでコードが追加で実行されることがあります。. env_var.sh
PATH
LD_PRELOAD
ENV
答え2
bash "source"コマンドを次のように使用します。
source env_var.txt
すべての変数をインポートする必要があります。
より多くの情報を知りたい場合:https://en.wikipedia.org/wiki/Dot_(コマンド)