web-dev-qa-db-ja.com

bashの「a = b」と「exporta = b」の違い

違いは何ですか:

a=b

そして

export a=b

バッシュで?

どちらも環境変数を定義していることを理解していますが、違いを完全には理解していません。

57
Adam Matan

exportは、変数をサブプロセスに伝播します。

たとえば、あなたがした場合

FOO=bar

次に、FOOをチェックしたサブプロセスは変数を見つけられませんが、

export FOO=bar

サブプロセスがそれを見つけることができます。

ただし、FOOすでに環境変数として定義されている場合、FOO=barはその環境変数の値を変更します。

例えば:

FOO=one     # Not an environment variable
export FOO  # Now FOO is an environment variable
FOO=two     # Update the environment variable, so sub processes will see $FOO = "two"

古いシェルはexport FOO=bar構文をサポートしていませんでした。あなたはFOO=bar; export FOOを書かなければなりませんでした。

59
Mike McQuaid

exportを使用しない場合は、環境変数を定義していません。シェル変数だけです。

シェル変数は、シェルプロセスでのみ使用できます。環境変数は、シェルだけでなく、後続のプロセスで使用できます。

29
wfaulk

また、エクスポートを使用せずに、呼び出し元のシェルで変数を使用できるようにするには、次のようにします。

ファイルa.kshは-

#!/bin/ksh
FOO=bar

プロンプトで、これを実行します

> . a.ksh

これにより、同じシェル内でコマンドが実行され、$ FOOが使用可能になります。

一方、

> a.ksh

$ FOOは、a.kshの呼び出し後は存在しないため、a.ksh内でのみ使用可能になります。

3
alok

すでに回答されていることに加えて、これらのステートメントはどちらも、「a」がシェルまたは環境変数としてすでに存在する可能性があるため、必ずしも環境変数を定義(つまり、作成と設定)するわけではありません。

後者の場合、両方のステートメントは厳密に同等です。

2
jlliagre