Bash(またはその他)で変数環境変数を設定する

Bash(またはその他)で変数環境変数を設定する

私のスクリプトで設定する環境変数のキーと値のペアを含むファイルを読み取って設定しようとしています。

これまで私はこれを持っています:

#!/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。あなたの問題はパイプ()のようです|。パイプラインのすべてのコマンドはサブシェルで実行されます。例では、スクリプトを実行するインスタンスはbash2つのサブシェル(1つはfor、cat $11つはfor)を分岐しますwhile read ...。変数はwhileループを実行するサブシェルに割り当てられてエクスポートされ、サブシェルが終了するとすぐにすべての変数が発生します。この問題を解決する1つの方法は、サブシェルをまったく生成しないことです。変える猫の無駄な使用、リダイレクトしてみてください。

while read ...; do
   ...
done < "$1"

バッシュFAQ 24これについてさらに説明する。

別の方法は、ファイルソースをインポートしてエクスポートを追加することです。

. <(sed '/^export/!s/^/export /' "$1")

これが<( )プロセスの代替です。

注意すべきもう1つのことは、パラメータから環境変数を読み取るため、パラメータファイルが$1スクリプトに悪影響を及ぼさないように信頼できるソースであることを確認する必要があることです。

おすすめ記事