環境変数とは何でしょうか?

環境変数とは何でしょうか?

VARIABLE=value環境変数を作成し、export VARIABLE=value現在のシェルによって作成されたプロセスで使用できるようにすることは知っています。env現在の環境変数が表示されますが、それらはどこに保存されていますか?環境変数(または環境、 そのことについては)?

答え1

環境は、見た目ほど魔法のようなものではありません。シェルはそれをメモリに保存し、execve()システム コールに渡します。子プロセスはそれを と呼ばれる配列ポインタとして継承しますenviron。man ページからexecve引用:

概要

   #include <unistd.h>

   int execve(const char *filename, char *const argv[],
              char *const envp[]);

argvは、新しいプログラムに渡される引数文字列の配列です。
慣例により、これらの文字列の最初の部分には、実行されるファイルに関連付けられたファイル名が含まれます。 はenvp、慣例的に key=value の形式の文字列の配列であり、新しいプログラムに環境として渡されます。

マンenviron(7)ページにもいくつかの洞察が示されています:

概要

   extern char **environ;

説明

変数は、 environ「環境」と呼ばれる文字列へのポインターの配列を指します。この配列の最後のポインターの値は ですNULL。(この変数はユーザー プログラムで宣言する必要がありますが、ヘッダー ファイルが<unistd.h>libc4 または libc5 からのものである場合、および glibc からのものであり _GNU_SOURCE が定義されている場合は、ヘッダー ファイルで宣言されます。) この文字列の配列は、プロセスを開始した exec(3) 呼び出しによってプロセスで使用できるようになります。

これら両方のGNUマニュアルページは、POSIX仕様

答え2

少し間違っています:SOME_NAME=valueシェル変数を作成します (ほとんどのシェルで)。export SOME_NAME=value環境変数を作成します。良くも悪くも、ほとんどの Unix/Linux/*BSD シェルは、環境変数とシェル変数にアクセスする際に同一の構文を使用します。

より広い意味では、「環境」とはプログラムの実行に伴う情報に過ぎません。C プログラムでは、プロセス ID は呼び出しで見つけられますがgetpid()、シェル プログラムでは変数アクセスを使用します。$$プロセス ID はプログラムの環境の一部にすぎません。「環境」という用語は、プログラム実行のモデル化など、より理論的なコンピュータ サイエンスのトピックから来ていると思います。プログラム実行のモデルには、環境「変数とその値の間の関連付けが含まれます」。

そして、この後者のより強力な定義は、Unix/Linux/*BSD シェルの「環境」、つまり名前 (「変数」) とその値の関連付けです。ほとんどの Unix スタイルのシェルでは、値はすべて文字列ですが、これは以前ほど厳密には当てはまりません。Ksh、Zsh、Bash にはすべて、現在では型付き変数があります。シェル関数の定義もエクスポートできます。

単純なシェル変数とは別の環境の使用には、fork/execすべての Unix が使用する新しいプロセスを開始する方法が含まれます。名前/値のペアを使用すると、その名前/値のペアは、システム コール (通常は の後に続きますが、シェル コマンドが使用された場合は除きます)exportを使用してシェルによって開始された新しい実行可能ファイルの環境に存在します。execve(2)fork(2)exec

の後にexecve()main()new binary の関数には、コマンドライン引数、環境 (var=value文字列へのポインタの NULL で終了する配列として格納されますenviron(7)。マニュアル ページを参照してください) があります。継承されるその他の状態には、ulimit設定、現在の作業ディレクトリ、および呼び出しexecve()元が FD_CLOEXEC を設定していない開いているファイル記述子が含まれます。 tty の現在の状態 (エコーが有効、raw モードなど) も、新しく作成されたプロセスによって継承される実行状態の一部と見なすことができますexec

bashマニュアルの説明を参照してください実行環境単純なコマンド(組み込み関数またはシェル関数以外)の場合。

Unix 環境は、少なくとも他のいくつかのオペレーティング システムとは異なります。VMS の「語彙」は子プロセスによって変更でき、その変更は親プロセスで確認できます。子cdプロセス内の VMS は、親プロセスの作業ディレクトリに影響します。少なくとも一部の状況ではそうであり、私の記憶が間違っている可能性があります。

環境変数には、、、など、よく知られているものがあります。一部の環境変数は特定$HOMEのプログラミング システムで慣例となっているため、親シェルは、特定の一時ディレクトリや、 には表示されないユーザー ID とパスワードなど、多くの特別な目的の情報をプログラムに渡すことができます。たとえば、単純な CGI プログラムは、環境変数を介して Web サーバーから多くの情報を継承します。$PATH$LD_LIBRARY_PATHps -ef

答え3

環境変数は、その最も単純な形式では、名前と値のペアのセットにすぎません。bash のマニュアル ページ ( man 1 bash) の ENVIRONMENT セクションで説明されているように、

   When  a  program  is invoked it is given an array of strings called the
   environment.   This  is  a  list  of  name-value  pairs,  of  the  form
   name=value.

   The  shell  provides  several  ways  to manipulate the environment.  On
   invocation, the shell scans its own environment and creates a parameter
   for  each name found, automatically marking it for export to child pro-
   cesses.  Executed commands inherit the  environment.

実際には、現在のシェルから呼び出されるプログラムに共通または固有の動作を定義できます。たとえば、crontabまたはを使用する場合、環境変数visudoを定義して、システムがデフォルトで使用するエディター以外のエディターを定義できます。同じことは、環境を調べてマニュアル ページの出力を表示するために使用するページャ プログラムを決定するEDITORコマンドにも当てはまります。manPAGER

非常に多くの UNIX コマンドは環境を読み取り、そこに設定されている内容に応じて出力/処理/アクションを変更します。共有されるものもあれば、プログラムに固有のものもあります。ほとんどのマニュアル ページには、環境変数が記述されているプログラムにどのように影響するかに関する情報が含まれています。

その他の実用的な例としては、同じプラットフォーム上に Oracle が複数インストールされているシステムなどが挙げられます。 を設定するとORACLE_HOME、Oracle コマンド スイート全体 (PATH環境変数からロードされる) が、その最上位ディレクトリの下から設定、定義、マッピング、ライブラリを取得します。 環境変数を使用する Java などの他のプログラムにも同じことが当てはまりますJAVA_HOME

HISTSIZEbash 自体には、履歴 (などHISTFILE)、画面サイズ ( COLUMNS)、タブ補完 ( FIGNOREGLOBIGNORE)、ロケールと文字のエンコード/デコード ( LANGLC_*)、プロンプト ( PS1.. ) など、さまざまな動作を変更できる環境変数が多数ありますPS4(これも bash のマニュアル ページで情報を探してください)。

また、独自のカスタム環境変数 (設定を渡したり機能を変更したりするため) を利用するスクリプト/プログラムを作成することもできます。

答え4

"環境変数"コンピューター上で実行中のプロセスの動作に影響を与える可能性のある動的な名前付き値のセットです。

これらは、プロセスが実行されるオペレーティング環境の一部です。たとえば、実行中のプロセスは、TEMP 環境変数の値を照会して一時ファイルを保存するのに適した場所を見つけたり、HOME または USERPROFILE 変数を照会してプロセスを実行しているユーザーが所有するディレクトリ構造を見つけたりすることができます。

詳細はこちら→http://en.wikipedia.org/wiki/環境変数

環境変数について知りたいことすべて...↑

関連情報