![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
なぜ環境変数というものが生まれたのか。
設定ファイルとコマンドラインオプションの概念が有れば事足りるように思います。
(多分) ずっと昔に作られて、各種OSで使われているという事は、重要な概念だということを
意味していると推測します。しかし、その重要さが分かりません。
ファイルアクセスは昔はオーバヘッドが大きかったから使えなかったんでしょうか。
もしかして、環境変数が子プロセスに継承されるという性質が重要な役割を担ってるんでしょうか。
昔は価値があったが、今はあまり無い?
それとも、自分が使ってないだけで皆使っている?
特定の問題領域ではよく使われている?
とりとめの無い質問で申し訳有りませんが、よろしくお願いします。
No.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が読めない。
なるほど。まとめると、
* 呼び出す時の状況に応じて微妙に処理を変えたい事がある
* 環境変数だと、その変えたい処理を子プロセス・孫プロセスにも一緒に反映させることができる
* 秒間に100~1000プロセスくらいのプロセスが生成されることがあるため、ファイルオープンのオーバヘッドも馬鹿にならない
* ~/Environmentsなど1ファイルに情報をまとめていると、排他処理でボトルネックになる
ということですね。
理解できてきました。特にLANGを子プロセスに伝える所は納得しました。確かにコマンドラインオプションで伝えていくのは無駄ですね。
ありがとうございます!
No.3
- 回答日時:
例えば「PATH」環境変数はプログラムファイルの検索
対象を指定するものですが、これを設定ファイルから
取得しようとした場合、それがどのディレクトリ上に
有るかが判っていないといけません。
そうすると「PATH」の値を使って、実行プログラムの
有るディレクトリを探そうとしているのに、「PATH」
の値が取得できない事になります。
また、コンソール端末上で環境変数を変更した場合は
その値が反映されるのは、そのコンソール端末だけで
すが、設定ファイルの値を変更してしまうと、そうは
いかなくなります。
ご回答ありがとうございます。
> また、コンソール端末上で環境変数を変更した場合は
その値が反映されるのは、そのコンソール端末だけで
すが、設定ファイルの値を変更してしまうと、そうは
いかなくなります。
これは知らなかったです。そうなんですね。
No.2
- 回答日時:
多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。
これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。
TEMPとか、HOMEとか、PATHとか、LANGとか、TERMとか。
あと、メモリ参照に比べての、ファイルアクセスのオーバーヘッドは昔も今も大きいですよ。
特定のプログラムだけで使うオプションを、設定ファイルで指定するのか環境変数で指定するのかというのは、確かにトレードオフがあるかと思います。使用頻度でしょうかね。例えば、ls のカラーオプションは、LS_COLORSという環境変数で設定されていますが、これを、$HOME/.lsrc /etc/lsrc のような設定ファイルから読むような仕様はありでしょう。ただ、ls 起動のたびに、追加で2ファイルをオープンするのはオーバーヘッドがあるのでトレードオフの検討で採用は否でしょうね。
この回答への補足
ご回答ありがとうございます。
> 多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。
> これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。
こちらですが、例えば、~/Environmentsというファイル(名前は何でもいいですが)にPATH:..¥nTEMP:...¥n..というふうに書いておいて、どのプロセスもこれを参照すると決めることもできると思います。そうすれば、環境変数と同じ役割を果たせるのではないでしょうか。
また、このファイルを用意すれば、他のファイルと比べて使用頻度は格段に多くなるでしょうから、キャッシュへのアクセスで済むと思います。ディスクアクセスがなければ、環境変数へのアクセスとそれほど変わらないということにはなりませんか。
No.1
- 回答日時:
設定ファイルを読み込む時も、環境変数がないとたいへんだよ?
$HOME/.application-name-rc
コマンドラインに毎回設定ファイル名を入力しなければならないなんて面倒……。
いったい、いくつの設定ファイルの名前を覚えれなくちゃならないんだろう?考えただけで憂うつになるよ?
歴史は、他の回答者の紹介する文書をみてね!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・スタッフと宿泊客が全員斜め上を行くホテルのレビュー
- ・【大喜利】【投稿~8/27】 こんなガソリンスタンド二度と来るか!なぜそう思った?
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・【お題】動物のキャッチフレーズ
- ・【お題】甲子園での思い出の残し方
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・「それ、メッセージ花火でわざわざ伝えること?」
- ・自分用のお土産
- ・人生で一番お金がなかったとき
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・ちょっと先の未来クイズ第1問
- ・ゴリラ向け動画サイト「ウホウホ動画」にありがちなこと
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Fatal server error?
-
chownでファイル所有者なのに別...
-
VLC media playerを常にデフォ...
-
jpgファイルが開かない
-
Linuxを入れたばかりなのにタイ...
-
Wine 黒い画面
-
cronでBAD FILE MODEが多発しま...
-
LASTコマンド、wtmpに...
-
TELNET、FTPでrootを許可したい。
-
umaskの初期値について
-
hosts に 記載がなければ追加...
-
嫌ってるのに真似してきたりマ...
-
ODBCエラー「admin」によってロ...
-
教えてください!困ってます。
-
Winmerge ファイルの中身は同じ...
-
バッチファイルで変数の中身を...
-
onedriveの中身を削除したらパ...
-
BAKファイルを非表示にする方法
-
同期センターのマークが出てま...
-
ファイルの先頭行を全て削除したい
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VLC media playerを常にデフォ...
-
ドラック&ドロップ出来ない時...
-
~/.bash_profileがログイン時に...
-
Macでrtf書類を開くアプリケー...
-
ward(mac)の<標準>ツールバー...
-
hosts に 記載がなければ追加...
-
LANG="ja_JP.UTF-8"設定がサー...
-
Scriptを教えて下さい。(10.4)
-
2台のWindowsでユーザー名を同...
-
jpgファイルが開かない
-
crontabの設定ができない(編集...
-
BINDで独自ドメインの名前解決...
-
ラズパイのファイルのパーミッ...
-
Wine 黒い画面
-
デスクトップの再構築?
-
【UNIX】/var/adm/wtmpx という...
-
コマンドプロンプトの標準テキ...
-
Linuxを入れたばかりなのにタイ...
-
Fatal server error?
-
Macでphp.iniファイルの記述を...
おすすめ情報