env
、、 などの環境コマンドを実行するset
とunset
、何かが起こります。
set hello='hello world!'
unset find
コマンドで何をしますか?変更は永続的ですか、それとも一時的ですか? 変更はどこで確認できますか? 私はUbuntu初心者です。
env
、、 などの環境コマンドを実行するset
とunset
、何かが起こります。
set hello='hello world!'
unset find
コマンドで何をしますか?変更は永続的ですか、それとも一時的ですか? 変更はどこで確認できますか? 私はUbuntu初心者です。
変更は一時的なものです。それらは現在のシェルでのみ持続します。~/.profile
orに環境変数を設定すると~/.bash_profile
(既に存在するものを使用ls -a ~
して参照するだけです)、これらのファイルは新しいシェルを開くたびに「ソース」となるため、効果的に永続的になります。
たとえば、次を追加した場合:
export HELLO="world"
では、新しいシェルを開く~/.profile
たびにその変数が使用可能になります (現在のシェルを で更新できますsource ~/.profile
)。次の方法でテストできます。
$ echo $HELLO
world
環境変数は、システム全体のスクリプトに使用されます。お気に入りのエディターを設定するなどのことができます。
export EDITOR="nano"
できる便利なことの 1 つは、プロンプト文字列を設定することです。
Bill:~$ export PS1="\u is awesome$ "
Bill is awesome$ ls
Bill is awesome$ du -h
Bill is awesome$ ...etc...
作成された各プロセスは、そのプロセスが続く限り存続する独自の環境を取得します。シェルは他のプロセスと同じです。その環境は独自のものです。
引数なしで「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
これは、 KEY=VALUE ペアの分離されたソートされていないリストだと思います。
このメモリのビットは毎回コピーされ、fork()
によって消去されexec()
ないため、変更はすべて子プロセスにコピーされます。
Unix シェルは、 が使用されるまで、この環境変数メモリに変数を書き込みませんexport
。これが、シェル変数と環境変数の違いです。
bash シェルで"x=2"
は、環境変数を設定しません。 "export x=2"
または"x=2; export x"
します。