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

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

実際、私はコマンドラインから2つの異なるタイプの変数にアクセスできることを知りませんでした。私が知っているのは、次のような変数を宣言できるだけです。

foo="my dear friends"
bar[0]="one"
bar[1]="two"
bar[2]="three"

または$記号を使用してアクセスします。例:

echo $foo
echo ${bar[1]}

または、次の組み込み変数を使用してください。

echo $PWD
PATH=$PATH:"/usr/bin/myProg"

これで、変数にはシェル変数と環境変数という2つのタイプ(少なくとも?)があると聞きました。

  • 2種類の目的は何ですか?
  • 変数がどのタイプであるかをどうやって知ることができますか?
  • それぞれの一般的な用途は何ですか?

ベストアンサー1

シェル変数

シェル変数は、インタラクティブシェルセッションやスクリプトなど、現在のシェルセッション内でスコープされている変数です。

未使用の名前に値を代入してシェル変数を作成できます。

var="hello"

シェル変数は、現在のセッションのデータを追跡するために使用されます。シェル変数名は通常小文字です。

環境変数

環境変数はエクスポートされたシェル変数です。これは、その変数が作成されたシェルセッション内だけでなく、そのセッション(シェルだけでなく)から開始されたすべてのプロセスでも変数として表示されることを意味します。

VAR="hello"  # shell variable created
export VAR   # variable now part of the environment

または

export VAR="hello"

シェル変数をエクスポートすると、設定が解除されるか、その「エクスポートプロパティ」が削除されるまで(export -ninを使用bash)エクスポートされたままになるため、通常は再エクスポートする必要はありません。変数の設定を解除すると、unsetその変数が削除されます(環境変数かどうかにかかわらず)。

他のシェルの配列と関連ハッシュはbash環境変数としてエクスポートできません。環境変数は、値が文字列である単純変数でなければならず、名前は通常大文字で構成されています。

環境変数は現在のシェルセッションでデータを追跡するために使用されますが、開始されたプロセスがこのデータの一部を取得できるようにするためにも使用されます。一般的なケースは、PATHシェルで設定してからプログラムへのフルパスを指定せずに、プログラムを起動したいすべてのプログラムで使用できる環境変数です。

プロセスの環境変数の集まりをしばしば「プロセス環境」と呼びます。各プロセスには独自の環境があります。

環境変数は「転送」のみ可能です。つまり、子プロセスはいいえ親プロセスでの環境変数の変更 親プロセスは、子プロセスの起動時に環境を設定する場合を除き、子プロセスの既存の環境を変更することはできません。

env環境変数は引数なしでリストできます。それ以外の場合は、シェルセッションでエクスポートされていないシェル変数と同じです。他のほとんどのプログラミング言語は通常「一般」変数と環境変数を混在させないため、これはシェルには少し特別です。(下記参照)。

env現在のセッションで設定せずに、プロセス環境で1つ以上の環境変数値を設定するためにも使用できます。

env CC=clang CXX=clang++ make

まず、make環境変数をCC値に設定し、clangCXX設定しますclang++

それはまた使用することができます明らかプロセス環境:

env -i bash

これは開始されますが、bash現在の環境を新しいbashプロセスに転送することはありません(まだ持つ環境変数は、シェル初期化スクリプトから新しい環境変数を生成するためです)。

違いの例

$ var="hello"   # create shell variable "var"
$ bash          # start _new_ bash session
$ echo "$var"   # no output
$ exit          # back to original shell session
$ echo "$var"   # "hello" is outputted
$ unset var     # remove variable

$ export VAR="hello"  # create environment variable "VAR"
$ bash
$ echo "$VAR"         # "hello" is outputted since it's exported
$ exit                # back to original shell session
$ unset VAR           # remove variable

$ ( export VAR="hello"; echo "$VAR" )  # set env. var "VAR" to "hello" in subshell and echo it
$ echo "$VAR"         # no output since a subshell has its own environment

その他の言語

ほとんどのプログラミング言語には、環境変数を取得および設定できるライブラリ機能があります。環境変数は単純なキーと値の関係で格納されるため、通常は言語の「変数」ではありません。プログラムはキー(環境変数の名前)に対応する値(常に文字列)を取得できますが、それを整数または言語で予想される値に変換する必要があります。

Cではgetenv()setenv()およびを使用してputenv()環境変数にアクセスできますunsetenv()。 Cプログラムによって開始されたすべてのプロセスは、同じ方法でこれらのルーチンを使用して生成された変数を継承します。

他の言語は%ENVPerlのハッシュまたはENVIRONほとんどのawk

おすすめ記事