- ベストアンサー
環境変数の重要性と生まれた経緯
- 環境変数とは、設定ファイルやコマンドラインオプションを補完する概念であり、各種OSで広く使用されています。
- 環境変数の重要な役割の一つは、子プロセスに継承される特性です。これにより、プロセス間で設定情報を共有することが可能となります。
- 環境変数は昔は価値があったが、現在ではあまり使われていない場合もあります。しかし、特定の問題領域ではまだよく活用されています。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No2です。 >こちらですが、例えば、~/Environmentsというファイル LANGとかTERMは使う端末によって変わり得るわけですが、どうしますか? あと、シェルコマンドラインからの実行時と、cron起動で環境を変えたいとかもありそう。 No3の方が書いてるように一時的に変えたいこともありますね。 例えば英文マニュアルが読みたいときは、bash等だと、 LANG=C man bash これはmanにオプションを追加して man --lang=C bash のようにすればいいと思うでしょうが、manは内部で複数のプログラムを起動しているので、それら子プログラムにも全部その情報を伝えないといけない。 PATHをシェルスクリプトの中で設定し直すのはけっこうありますし、HOMEを一時的に変えて作業したいこともたまにはあります。 ~/Environmentsを読むとしても、~ つまりHOMEの値を得るのも/etc/passwdを読む必要がありますね。HOME取得サブルーチンを標準ライブラリに追加するのでしょうけど、関数コール1つで得られるようになってもファイルを読むことには違いない。 他にファイルに書けない物として、動的に決まる環境変数もありますよね。ログイン接続元IPアドレスとか。シェルのネスティング階層とか。 先の回答に書いたように、ファイルオープンやリードのオーバーヘッドはそれなりにあるので、秒何百何千件もプロセスが生成されたりすると無視できない量になります。プロセス起動ごとに現在の物に追加して3つか4つあるいはそれ以上のファイルを読まないといけない。 単にメモリにアクセスするのと、ファイルを見に行ってたまたまキャッシュに載っているのを比べても全然違います。それにメモリはプロセス固有だけど、ファイルは共有資源なので排他制御が関係してくるとさらに遅い。例えば、ホームディレクトリを更新するプロセスがあるとその排他が解けるまで~/Environmentsが読めない。
その他の回答 (3)
- don_go
- ベストアンサー率31% (336/1059)
例えば「PATH」環境変数はプログラムファイルの検索 対象を指定するものですが、これを設定ファイルから 取得しようとした場合、それがどのディレクトリ上に 有るかが判っていないといけません。 そうすると「PATH」の値を使って、実行プログラムの 有るディレクトリを探そうとしているのに、「PATH」 の値が取得できない事になります。 また、コンソール端末上で環境変数を変更した場合は その値が反映されるのは、そのコンソール端末だけで すが、設定ファイルの値を変更してしまうと、そうは いかなくなります。
お礼
ご回答ありがとうございます。 > また、コンソール端末上で環境変数を変更した場合は その値が反映されるのは、そのコンソール端末だけで すが、設定ファイルの値を変更してしまうと、そうは いかなくなります。 これは知らなかったです。そうなんですね。
- notnot
- ベストアンサー率47% (4900/10358)
多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。 これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。 TEMPとか、HOMEとか、PATHとか、LANGとか、TERMとか。 あと、メモリ参照に比べての、ファイルアクセスのオーバーヘッドは昔も今も大きいですよ。 特定のプログラムだけで使うオプションを、設定ファイルで指定するのか環境変数で指定するのかというのは、確かにトレードオフがあるかと思います。使用頻度でしょうかね。例えば、ls のカラーオプションは、LS_COLORSという環境変数で設定されていますが、これを、$HOME/.lsrc /etc/lsrc のような設定ファイルから読むような仕様はありでしょう。ただ、ls 起動のたびに、追加で2ファイルをオープンするのはオーバーヘッドがあるのでトレードオフの検討で採用は否でしょうね。
補足
ご回答ありがとうございます。 > 多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。 > これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。 こちらですが、例えば、~/Environmentsというファイル(名前は何でもいいですが)にPATH:..¥nTEMP:...¥n..というふうに書いておいて、どのプロセスもこれを参照すると決めることもできると思います。そうすれば、環境変数と同じ役割を果たせるのではないでしょうか。 また、このファイルを用意すれば、他のファイルと比べて使用頻度は格段に多くなるでしょうから、キャッシュへのアクセスで済むと思います。ディスクアクセスがなければ、環境変数へのアクセスとそれほど変わらないということにはなりませんか。
- dscripty
- ベストアンサー率51% (166/325)
設定ファイルを読み込む時も、環境変数がないとたいへんだよ? $HOME/.application-name-rc コマンドラインに毎回設定ファイル名を入力しなければならないなんて面倒……。 いったい、いくつの設定ファイルの名前を覚えれなくちゃならないんだろう?考えただけで憂うつになるよ? 歴史は、他の回答者の紹介する文書をみてね!
お礼
なるほど。まとめると、 * 呼び出す時の状況に応じて微妙に処理を変えたい事がある * 環境変数だと、その変えたい処理を子プロセス・孫プロセスにも一緒に反映させることができる * 秒間に100~1000プロセスくらいのプロセスが生成されることがあるため、ファイルオープンのオーバヘッドも馬鹿にならない * ~/Environmentsなど1ファイルに情報をまとめていると、排他処理でボトルネックになる ということですね。 理解できてきました。特にLANGを子プロセスに伝える所は納得しました。確かにコマンドラインオプションで伝えていくのは無駄ですね。 ありがとうございます!