環境変数とシェル変数、違いは何ですか?


回答:


35

$BASHあるローカル変数の現在の(bashの)でのみ有効ですシェル。

などの環境変数$SHELLは、システム全体で有効です。現在のBashシェルでは、$BASHの実行パスを指すbashのに対し、$SHELL(同じ値であってもよい)は、デフォルトとして定義シェルを指します。

環境変数の説明については参照環境変数 Ubuntuのヘルプを。


1
素晴らしいリンク(+1):)
Peter.O

12
この答えは不正確/不正確です。環境変数はグローバル/システム全体ではありません。シェル変数は、現在実行中のシェルに対してプライベートであり、子プロセスにはエクスポートされません(渡されません)。環境変数は、すべての子プロセスにエクスポートされます。"MYVAR = private; export OURVAR = shared; printenv"は、シェルがprintenvコマンドを実行するとOURVARをエクスポートしますが、MYVARはエクスポートしないため、 "OURVAR"のみを報告します。
CM

2
CMのコメントに+1!こんなに簡単かつ正確に説明された違いを聞いたことがありません!!! このコメントが答えになるはずです。
風の放浪者ジェシー

48

環境変数は、プログラムおよびその子プログラムでグローバルに利用可能です。シェル変数は、現在のシェルでのみ使用可能です。シェル変数を環境変数として使用可能にするには、export VARNAME(ドルなしで$)を使用します。

明確化の例:

$ SOME=VAR # define shell variable $SOME
$ echo $SOME
VAR
$ env | grep SOME # note: no output
$ export SOME # turn $SOME into an environment variable
$ env | grep SOME
SOME=VAR

環境変数を定義する別の方法:

$ export ANOTHER=VALUE
$ echo $ANOTHER
VALUE
$ env | grep ANOTHER
ANOTHER=VALUE

これは正しいとは思いません。export必ずしも環境変数を設定するとは限りません。stackoverflow.com/questions/7411455/...
クリスStryczynski

3
@ChrisStryczynski exportは、子プロセスの環境変数を設定します。リンクした投稿はこの答えと矛盾していませんが、なぜ間違っていると思うのかを明確にできますか?
-Lekensteyn

export環境変数を絶対に設定します
デビッドトンホーファー

9

違いがあります。シェル変数と環境変数は、私ができることをよりよく説明しますが、ここからの抜粋です:

シェル変数に変更が加えられた場合、フォークされたサブプロセスが変更を確認できるように、対応する環境変数に明示的に「エクスポート」する必要があります。シェル変数は、それらが定義されたシェルに対してローカルであることを思い出してください。


私は自分の答えをコメントしています。私は本当にのようなヘルプのUbuntu Takkatの回答内のリンク···(それは私のものよりはましだ)
Peter.O

3
さらに、リンクが機能しなくなりました!

1

シェル変数:短期、シェルの現在のインスタンスにのみ適用され、システム全体には適用されません

環境変数:長期使用、有効なシステム全体、グローバルに許可

規則により、シェル変数の名前は小文字で、Envn。変数は大文字で書き込まれます


-1

この質問に答えるには、まず変数のスコープを理解してください。

同様に新しい変数を作成するとSOME_ENV_VARIABLE="testing.txt"、それが中に存在するSHELL scope、すなわち、によってアクセスされることを意味するシェルのインスタンスユーザがログインしている。例えば、インスタンスの変更は、新しい端末を開いたり、あなたが(たとえばシェルを変更しますに切り替えcshます)その変数にアクセスできません。

export SOME_ENV_VARIABLEその変数が環境スコープで使用可能になったように、その変数をエクスポートすると、そのインスタンスでシェルを変更した場合でもその変数にアクセスできます。次の例で理解してみましょう。

[vishrant@localhost]$ SOME_ENV_VARIABLE="testing.txt" #creating variable in bash shell
[vishrant@localhost]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost]$ export SOME_ENV_VARIABLE #variable now available with environment
[vishrant@localhost]$ env | grep SOME_ENV_VARIABLE
SOME_ENV_VARIABLE=testing.txt
[vishrant@localhost]$ csh #changing shell
[vishrant@localhost ~/shell_scripting]$ echo $SOME_ENV_VARIABLE
testing.txt
[vishrant@localhost ~/shell_scripting]$ exit
exit #returned to parent shell
[vishrant@localhost]$ SOME_SHELL_VARIABLE="hello.txt"
[vishrant@localhost]$ csh
[vishrant@localhost ~/shell_scripting]$ echo $SOME_SHELL_VARIABLE
SOME_SHELL_VARIABLE: Undefined variable.

アナロジー: 2ベッドルームのアパートがあり、別のルームメイトと共有しているとします。共有エリアには誰でもアクセスできますが、寝室は使用できません。環境変数は共有エリアのようなもので、シェル変数は寝室のようなものです。あなたによってアクセスされます。

新しいターミナルを開くと、そのインスタンスを変更しているため、どちらの変数にもアクセスできません。そのためには、.profileまたは.bashrc(bashを使用している場合)に変数を追加する必要があります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.