2009-03-24 6 views
1

env,setunsetなどの環境コマンドを実行すると何か起こりますが、何が起こりますか?環境変数ではどうしますか?

set hello='hello world!' 
unset find 

コマンドではどうしますか?変更は永久か一時的か?あなたはどこで変化を見ることができますか?私はUbuntu初心者です。

+0

これはこの種の質問のための適切な場所ではありません、私はUbuntuコミュニティフォーラムが良いと思います。 – ninesided

+0

私は物事を単純にしようとしています。タイトルを混乱させてはいけません。暗黙のうちにプログラミングに関連する見通しを仮定した。プログラマーの視点を聞きたい。 –

答えて

2

作成された各プロセスは、独自の環境これを取得その過程で生きています。あなたのシェルは他のプロセスとまったく同じです。その環境は独自のものです。

引数なしで 'set'と入力すると、存在するものが表示されます。これらの設定の多くはプログラムの動作を制御するためのものです。検索パス、必要なX11ディスプレイ、ホームディレクトリ(/ home/yourname以外)など

実際に使用する必要があります。他のアプリケーションが読むことができる変数に、またはシェルからアクセスできる変数に、いくつかの有用な情報(ある種のプログラムに長いコマンド行オプションのリストなど)を保存する必要があるときはいつでも、環境を使用します。例えば

USUAL_CONFIGURE_OPTS="--prefix=/home/charlie --sysconfdir=/home/charlie/tmp-etc" 
./configure $USUAL_CONFIGURE_OPTS --and-additional-arguments 

を編集:プログラマーとして

、私は、ユーザーの好みを決定し、それらを遵守するために環境をお読みください。たとえば、変数POSIXLY_CORRECTが設定されている場合、私のプログラムの出力に影響を与えます。環境は、ユーザがどのように行動するかをプログラムに指示する場所である。また、上記のように、環境はユーザーが有用なビットを格納するのに便利な場所です。

もう一度(あなたのコメントに応じて)、実行されるすべてのプログラムはプロセスです。プロセスはそれ自身のアドレス空間(自身のメモリ)を取得し、その環境はその領域に格納されます。つまり、環境はそのプロセスに固有であり、プロセス自体の間だけ存続します。

編集2:

私は今、完全にあなたの質問を理解していると思います。誰かが「仮想環境」と言うと、環境はアプリケーションのアドレス空間に存在し、カーネルによって仮想メモリとしてマッピングされていることに気づいているだけです(一部のページは物理メモリにあり、等)。

プロセスがその特定の領域へのマップを明示的に作成して別のプロセスと共有しない限り、他の環境にアクセスすることはできません。やはり、プロセスのアドレス空間は完全にプライベートであり、他のプロセスから隔離されています。環境変数はそのアドレス空間内に存在します。そうでなければ、プロセスはそのアドレス空間にアクセスまたは操作できませんでした。

+0

私はUnix Power Toolsから、Linuxテキストのほとんどすべてを検討できることを理解しました。後の章では、この声明が完全に真実ではないと付け加えた。だから私はあなたの用語「プロセス」の使用によって混乱しています。プロセスはシグナルを送ることができ、テキストであり、実際にどのように定義されていますか? –

+0

@UnixBasicsでは、新しく作成されたプロセス(実行されるプログラム)はそれぞれメモリ内の独自のアドレス空間を取得します。他のプロセスから完全に分離されています。共有メモリーが明示的に設定されていない限り、プロセスAはプロセスBのメモリーを読み取ることができません。各プロセスの環境はそれぞれ独自のものです。 –

+0

@tinkertimあなたの説明をありがとう!プログラマーが「仮想」環境変数について話すとき、それらはどういう意味ですか?プロセスAは、他のプログラムがアクセスできる(しかしAの実(?)メモリにアクセスすることはできない)仮想メモリ内の正確な場所を有する。 env.varsはAの仮想env.varsを共有していますか? –

4

変更は一時的です。現在のシェルでのみ存続します。 ~/.profileまたは~/.bash_profileに環境変数を設定すると(すでに存在するものを使用し、ls -a ~を使用してください)、これらのファイルは新しいシェルを開くたびに「ソース」されるため、効果的に永続的になります。例えば

追加した場合、:

export HELLO="world" 

をご~/.profileに、その変数はあなたが(あなたがsource ~/.profileとあなたの現在のシェルをリフレッシュすることができます)新しいシェルを開くたびに利用可能になるでしょう。

$ echo $HELLO 
world 

システム全体のスクリプトに環境変数が使用されています。あなた好みのエディタを設定するようなもの、例えば操作を行うことができます。

export EDITOR="nano" 

あなたが行うことができます一つの有用な事はあなたのプロンプト文字列を設定されている、例えば:

Bill:~$ export PS1="\u is awesome$ " 
Bill is awesome$ ls 
Bill is awesome$ du -h 
Bill is awesome$ ...etc... 
0

引数リストと同様に、環境変数を格納するプロセスに割り当てられたメモリセクションがあります。私はKEY = VALUEのペアの、分割されていないリストの\0であると信じています。

このメモリのビットはfork()でコピーされ、exec()で消去されないため、変更はすべて子プロセスにコピーされます。

Unixシェルは、exportが使用されるまで、この環境変数メモリに変数を書き出しません。それはシェル変数と環境変数の違いです。

bashシェルでは、"x=2"は環境変数を設定しません。 "export x=2"または"x=2; export x"です。