web-dev-qa-db-ja.com

すべての変数をkey = valueファイルからシェルに*エクスポート*します

環境変数を子プロセスに継承したい場合は、次のようにします。

export MYVAR=tork

変数への値(スペースを含めることができる)の割り当てを含むファイルsite.confがあると仮定します。

EMAIL="[email protected]"
FULLNAME="Master Yedi"
FOO=bar

ここで、新しいシェルを開くたびに(たとえば、~/.bashrcまたは~/.profileにコードを使用して)このファイルを処理し、新しく開いたシェル内から開始されたプロセスが環境を介して割り当てを継承するようにします。変数。

明らかな解決策は、site.confの各行の前にexportを付けて、ファイルをソースすることです。ただし、ファイルは他のアプリケーションによっても(直接)読み取られるため、これを行うことはできません。そのため、形式は固定されています。

私は次のようなことを試みました

cat site.conf | while read assignment
do
  export "${assignment}"
done

ただし、これはさまざまな理由で機能しません(最も重要なのは、exportがサブシェルで実行されるため、変数が呼び出し元のシェルの子にエクスポートされないことです)。

プログラムでbashの未知の変数をexportする方法はありますか?

21
umläute

実行set -aファイルを調達する前。これにより、エクスポートに続くすべての新規および変更された変数が自動的にマークされます。

set -a
source site.conf
set +a  # Require export again, if desired.

観察した問題は、パイプがサブシェルでexportを実行することです。パイプの代わりに入力リダイレクトを使用するだけで、これを回避できます。

while read assignment; do
  export "$assignment"
done < site.conf

ただし、これは機能しません。たとえば、1行に複数の割り当てがある場合は、機能しません。

EMAIL="[email protected]" FULLNAME="Master Yedi" 
36
chepner