Linux環境変数の設定


9

Red Hat Linux Enterprise 5を実行しています。私は常に環境変数を設定するためにexportコマンドを使用しています。

環境変数を設定する他の方法はありますか?それらの利点/欠点は何ですか?

回答:


16

これはBashのmanページからの抜粋です。

export [-fn] [name [= word]] ...
export -p
指定された名前は、後で実行されるコマンドの環境への自動エクスポート用にマークされます。-fオプションが指定されている場合、名前は関数を参照します...

現在の環境でのみ変数が必要な場合は、エクスポートを使用する必要はありません。

var=value

編集:

エクスポートなし:現在の環境のみ。エクスポートあり:現在の環境と子環境。

以下は、子環境での変数の可用性に対するエクスポートの影響のデモであり、子環境での変更は親には影響しません。

$ var1=123
$ export var2=456
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []
$ var3=789 bash -c 'echo "child [$var1] [$var2] [$var3]"; var1=111; var2=222; var3=333; echo "child [$var1] [$var2] [$var3]"'
child [] [456] [789]
child [111] [222] [333]
$ echo "parent [$var1] [$var2] [$var3]"
parent [123] [456] []

最初のエコーの後(echo "parent...")あなたは、両方のために「123」と「456」を参照var1し、var2現在の環境で活動しています。var3まだ設定されていないため、の値は表示されません。

" var3=..." で始まる行の後は、var1エクスポートされなかったため、の値は表示されません。あなたはないの値を参照してくださいvar2、それがため輸出しました。var3子環境のみに設定されているため、の値が表示されます。

(オプションbash -cの引数の内容でスクリプトを実行することと同じ-cです。スクリプトまたは他の実行可能ファイル、またはこの場合、引数bash -cは現在の環境の子になり、その結果、当然、子の親。)

「スクリプト」では、変数の値が変更されます。これらの新しい値が出力されます。

「スクリプト」が終了すると、実行は親環境(この場合はコマンドライン)に戻ります。最後のエコーの後、子環境で行われた変更は親に影響しないため、元の値が表示されます。


「現在の環境」とはどういう意味ですか?現在のbashスクリプトまたは?
George2

1
はい、「現在のスクリプト内」または「現在のインタラクティブセッション内」を意味します。そのため、現在のスクリプトまたはインタラクティブセッション内から実行される実行可能ファイルまたはスクリプトは除外されます。これが、exportこれらの子環境で変数を使用できるようにする目的です。
追って通知があるまで一時停止。

私はあなたの言ったことからいくつかの矛盾を見つけました。:-)「実行可能ファイルまたはスクリプトを除外する」ために、「除外する」に注意してくださいと述べましたが、引用したところ、「指定された名前は、後で実行されるコマンドの環境への自動エクスポート用にマークされています。」-"include"(自動的にエクスポート、またはインパクト)し、 "exclude"ではありません。混乱しています。詳しく説明してください。
George2

1
@ George2:詳細については、編集した回答を参照してください。
追って通知があるまで一時停止。

3

あなたはそれを言う

私は常にexportコマンドを使用して環境変数を設定しています

あなたが言ったように、環境変数をどのように持続させるのかを実際に尋ねようとしているようです。これを行うには、export VAR="foo"ステートメントを$ HOME / .bash_profileファイルに配置する必要があります(bashを使用している場合)。その環境変数をroot以外のすべてのユーザーに保持したい場合は、/ etc / profileに追加します。rootユーザーにも追加したい場合は、/root/.bash_profileに設定します。

これは、bashが選択したシェルであるすべてのログインシェルで機能します。非ログインシェルの場合、.bashrcを使用する必要があります。他のシェルに提供する洞察力はありません:D


2
これらのファイルがいつソースされるかについては、Bashのmanページのセクションをもう一度読んでください。
追って通知があるまで一時停止。

1
うん...私はログインとインタラクティブが混乱しました。反映するために私の答えを編集しています。訂正ありがとうございます!
クジラ2010年

「環境変数を持続させる」-持続とはどういう意味ですか?
George2

1
「永続化」とは、シェルが起動されるたびにこの変数にこの値を設定することを意味します。変数の目的によっては、変数をエクスポートする必要がある場合とない場合があります。
追って通知があるまで一時停止。

1
つまり、永続化していません。クジラが説明したことをやってみてください。
追って通知があるまで一時停止。

1

エクスポートはそれを行うための最も簡単な方法です、それでそれをそのままにしないのはなぜですか?

export VARIABLE=value    # for Bourne, bash, and similar shells
setenv VARIABLE value    # for csh and similar shells

2
BourneシェルにはVARIABLE = valueが必要です。VARIABLEのエクスポート
mpez0

1
これも機能するはずです...
BloodPhilia 2010年

@ BloodPhilia、bashの場合、環境変数を設定する唯一の方法は?
George2

1
@ George2-VARIABLE = valueを使用すると、現在のスクリプトの実行後に失われるローカル変数が作成されます。エクスポートを使用する場合、子プロセスは親プロセスから変数値を継承します。例:FOO=BAR; executethisprogram プログラムexecutethisprogramはvariableの値を知りませんFOO。一方、使用時:FOO=BAR; export FOO; executethisprogram プログラムexecutethisprogramはvariableの値を認識しますFOO
BloodPhilia 2010年

1
executethisprogramは「export FOO」のサブプロセスではありません。これは、それを呼び出すスクリプトのサブプロセス(子)またはインタラクティブ(コマンドライン)シェルです。コマンドが発行された環境の子プロセスがアクセスできるようにexport FOO変数をマークするコマンドですFOO。その親は、スクリプトまたはインタラクティブシェルである場合があります。
追って通知があるまで一時停止。

1

次のようなこともできます:

VAR=val application

例えば:

LANG=C ls --help

英語で出力されます。

LANG=pl_PL ls --help

ポーランド語で出力します(利用可能な場合)。

過去のshでは、VAL = valをエクスポートすることはできませんでした。あなたがしなければなりませんでした

VAL=val; export VAL

「VAR = valアプリケーション」について混乱しています。valの意味とapplicationの意味は何ですか。
George2

2
これらの例lsでは、現在の(親)環境の変数の値に影響を与えることなく、子環境(たとえば)の変数の値を設定します。
追って通知があるまで一時停止。

lsは何の子環境ですか?私は混乱しています。
George2

1
ls実行元のプロセスの子です。私が入力した場合ls、コマンドプロンプトで、対話型シェルは親で、ls子です。使用するスクリプトがある場合ls、そのスクリプトは親でlsあり、子です。
追って通知があるまで一時停止。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.