私はこれがVARIABLE=value
環境変数を生成し、export VARIABLE=value
現在のシェルで生成されたプロセスで使用できることを知っています。env
現在の環境変数を表示しますが、その変数はどこにありますか?環境変数(または環境、この質問について)?
答え1
環境は見えるほど魔法ではありません。シェルはそれをメモリに保存し、execve()
システムコールに渡します。子プロセスはそれを配列ポインタに継承しますenviron
。execve
マンページから:
要約
#include <unistd.h> int execve(const char *filename, char *const argv[], char *const envp[]);
argv
新しいプログラムに渡されるパラメーター文字列の配列。
通常、これらの文字列の最初には、実行中のファイルに関連付けられているファイル名を含める必要があります。envp
通常、キー=値型の文字列配列であり、新しいプログラムに環境に渡されます。
マンページはenviron(7)
またいくつかの洞察を提供します。
要約
extern char **environ;
説明する
この変数は、
environ
「environment」という文字列ポインタの配列を指します。配列の最後のポインタ値はですNULL
。 (この変数はユーザープログラムで宣言する必要がありますが、ヘッダーがlibc4またはlibc5から来た場合、glibcから来ており、_GNU_SOURCEが定義されている場合はヘッダーで宣言されます。<unistd.h>
)この文字列配列はprocess(3)プロセスを実行するために呼び出されます。
両方のGNUのマニュアルページは以下に関連しています。POSIX仕様
答え2
何か間違っています。SOME_NAME=value
シェル変数を作成します(ほとんどのシェルで)。export SOME_NAME=value
環境変数を作成します。良いか悪いかほとんどのUnix / Linux / * BSDシェルは、環境変数とシェル変数にアクセスするときに同じ構文を使用します。
より大きな意味では、「環境」は単にプログラムの実行に伴う情報です。 Cプログラムでは、を呼び出してプロセスIDを見つけることができ、getpid()
シェルプログラムは変数access:を使用します$$
。プロセスIDはプログラム環境の一部にすぎません。私は、「環境」という用語がプログラム実行モデリングのようなより理論的なコンピュータサイエンスの主題に由来していると信じています。プログラム実行モデルでは環境「変数とその値との関連付けを含みます。」
後者のより強力な定義は、Unix / Linux / * BSDシェルの「環境」、つまり名前(「変数」)とその値の間の関連です。ほとんどのUnixスタイルのシェルでは、これらの値は文字列ですが、それほど厳密ではありません。今日、Ksh、Zsh、Bashにはすべて型変数があります。シェル関数定義をエクスポートすることも可能です。
通常のシェル変数とは別の環境を使用するには、fork/exec
すべてのUnixが使用する方法で新しいプロセスを開始する必要があります。名前と値のペアを使用すると、名前と値のペアは、システムコール(シェルコマンドを使用しない限り通常は後で)を介してシェルで実行される新しいexport
実行可能ファイルの環境に表示されます。execve(2)
fork(2)
exec
これには、execve()
新しいmain()
バイナリ関数にコマンドライン引数である環境(NULLで終わる文字列ポインタ配列として格納されているvar=value
、environ(7)
マニュアルページを参照)があります。継承された他の状態にはulimit
、設定、現在の作業ディレクトリ、およびexecve()
呼び出し元がFD_CLOEXECを設定していないオープンファイル記述子が含まれます。 ttyの現在の状態(エコーアクティブ、ネイティブモードなど)も、exec
新しいプロセスによって継承された実行状態の一部と見なすことができます。
bash
手順についてはマニュアルを参照してください。実行環境簡単なコマンド用(組み込みまたはシェル機能を除く)。
Unix環境は、少なくとも他のオペレーティングシステムとは異なります。 VMS「語彙」は子プロセスによって変更され、変更は親プロセスで表示されます。子プロセスのVMSは、cd
親プロセスの作業ディレクトリに影響します。少なくとも場合によっては、私の記憶力が損なわれる可能性があります。
一部の環境変数は、などがよく$HOME
知られています$PATH
。$LD_LIBRARY_PATH
一部は特定のプログラミングシステムに関する一般的な情報なので、親シェルは特定の一時ディレクトリなどの特定のプログラムに多くの特別な目的の情報を渡したり、ps -ef
。 Webサーバーは環境変数を介して多くの情報を取得します。
答え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
コマンドの場合も同様です。man
PAGER
多くのUnixコマンドは環境を読み、設定された内容に従って出力/処理/作業を変更します。一部は共有され、一部はプログラム固有です。ほとんどのマニュアルページには、環境変数が記述するプログラムにどのような影響を与えるかについての情報が含まれています。
他の実際的な例は、同じプラットフォームに複数のOracleがインストールされているシステムと同じ状況に適用されます。設定を有効にすると、ORACLE_HOME
Oracleコマンドセット全体(PATH
環境変数からロードされます)は、この最上位ディレクトリから設定、定義、マッピング、およびライブラリを抽出します。 JavaやそのJAVA_HOME
環境変数などの他のプログラムでも同様です。
HISTSIZE
Bash自体には、履歴(などHISTFILE
)、画面サイズ(COLUMNS
)、タブ補完(、、FIGNORE
)GLOBIGNORE
ロケール、文字エンコード/デコード(LANG
、、LC_*
)、プロンプト(PS1
..)など、さまざまな動作を変更できるさまざまな環境変数があります。PS4
)など(もう一度bashのマニュアルページから知識を入手してください)。
カスタム環境変数を使用するスクリプト/プログラムを作成することもできます(設定の転送または機能の変更)。
答え4
「環境変数」実行中のプロセスがコンピュータでどのように機能するかに影響を与える可能性がある動的に名前付き値のセット。
これは、プロセスが実行されるオペレーティング環境の一部です。たとえば、実行中のプロセスは、TEMP環境変数の値を照会して一時ファイルを保管する適切な場所を見つけるか、HOME変数またはUSERPROFILE変数を照会してプロセスを実行しているユーザーが所有するディレクトリ構造を見つけることができます。
詳しくはこちらをクリック→http://en.wikipedia.org/wiki/Environment_variable。
環境変数について知りたいことすべて... ↑