私のスクリプトで設定する環境変数のキーと値のペアを含むファイルを読み取って設定しようとしています。
これまで私はこれを持っています:
#!/bin/bash
cat $1 | while read kv
do
key=${kv%=*}
val=`echo ${kv#*=} | sed 's/^"\|"$//g'`
export $key="$val"
done
次のようなファイルを読みたいです。
XAUTHLOCALHOSTNAME="localhost"
DISPLAY=":0"
XAUTHORITY="/tmp/some-XAuthority"
スクリプトの実行中にのみこの変数を使用する必要があるため、次の問題を解決する必要はありません。スクリプトの上位範囲の変数の設定。
私のテストによると、私の問題は次のとおりですexport $key="$val"
。したがって、対応するワイヤを交換すればよいようです。
ベストアンサー1
export $key=$val
うまくいきますbash
。あなたの問題はパイプ()のようです|
。パイプラインのすべてのコマンドはサブシェルで実行されます。例では、スクリプトを実行するインスタンスはbash
2つのサブシェル(1つはfor、cat $1
1つはfor)を分岐しますwhile read ...
。変数はwhileループを実行するサブシェルに割り当てられてエクスポートされ、サブシェルが終了するとすぐにすべての変数が発生します。この問題を解決する1つの方法は、サブシェルをまったく生成しないことです。変える猫の無駄な使用、リダイレクトしてみてください。
while read ...; do
...
done < "$1"
バッシュFAQ 24これについてさらに説明する。
別の方法は、ファイルソースをインポートしてエクスポートを追加することです。
. <(sed '/^export/!s/^/export /' "$1")
これが<( )
プロセスの代替です。
注意すべきもう1つのことは、パラメータから環境変数を読み取るため、パラメータファイルが$1
スクリプトに悪影響を及ぼさないように信頼できるソースであることを確認する必要があることです。