なぜ環境変数というものが生まれたのか。
設定ファイルとコマンドラインオプションの概念が有れば事足りるように思います。
(多分) ずっと昔に作られて、各種OSで使われているという事は、重要な概念だということを
意味していると推測します。しかし、その重要さが分かりません。
ファイルアクセスは昔はオーバヘッドが大きかったから使えなかったんでしょうか。
もしかして、環境変数が子プロセスに継承されるという性質が重要な役割を担ってるんでしょうか。
昔は価値があったが、今はあまり無い?
それとも、自分が使ってないだけで皆使っている?
特定の問題領域ではよく使われている?
とりとめの無い質問で申し訳有りませんが、よろしくお願いします。
No.1
- 回答日時:
設定ファイルを読み込む時も、環境変数がないとたいへんだよ?
$HOME/.application-name-rc
コマンドラインに毎回設定ファイル名を入力しなければならないなんて面倒……。
いったい、いくつの設定ファイルの名前を覚えれなくちゃならないんだろう?考えただけで憂うつになるよ?
歴史は、他の回答者の紹介する文書をみてね!
No.2
- 回答日時:
多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。
これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。
TEMPとか、HOMEとか、PATHとか、LANGとか、TERMとか。
あと、メモリ参照に比べての、ファイルアクセスのオーバーヘッドは昔も今も大きいですよ。
特定のプログラムだけで使うオプションを、設定ファイルで指定するのか環境変数で指定するのかというのは、確かにトレードオフがあるかと思います。使用頻度でしょうかね。例えば、ls のカラーオプションは、LS_COLORSという環境変数で設定されていますが、これを、$HOME/.lsrc /etc/lsrc のような設定ファイルから読むような仕様はありでしょう。ただ、ls 起動のたびに、追加で2ファイルをオープンするのはオーバーヘッドがあるのでトレードオフの検討で採用は否でしょうね。
この回答への補足
ご回答ありがとうございます。
> 多くの環境変数は、複数のプログラム(ほとんどの)が共通に使う設定を提供していますよね。
> これをやめて、すべてのプログラム起動時に指定するのは面倒と言うよりあり得ない。
こちらですが、例えば、~/Environmentsというファイル(名前は何でもいいですが)にPATH:..¥nTEMP:...¥n..というふうに書いておいて、どのプロセスもこれを参照すると決めることもできると思います。そうすれば、環境変数と同じ役割を果たせるのではないでしょうか。
また、このファイルを用意すれば、他のファイルと比べて使用頻度は格段に多くなるでしょうから、キャッシュへのアクセスで済むと思います。ディスクアクセスがなければ、環境変数へのアクセスとそれほど変わらないということにはなりませんか。
No.3
- 回答日時:
例えば「PATH」環境変数はプログラムファイルの検索
対象を指定するものですが、これを設定ファイルから
取得しようとした場合、それがどのディレクトリ上に
有るかが判っていないといけません。
そうすると「PATH」の値を使って、実行プログラムの
有るディレクトリを探そうとしているのに、「PATH」
の値が取得できない事になります。
また、コンソール端末上で環境変数を変更した場合は
その値が反映されるのは、そのコンソール端末だけで
すが、設定ファイルの値を変更してしまうと、そうは
いかなくなります。
ご回答ありがとうございます。
> また、コンソール端末上で環境変数を変更した場合は
その値が反映されるのは、そのコンソール端末だけで
すが、設定ファイルの値を変更してしまうと、そうは
いかなくなります。
これは知らなかったです。そうなんですね。
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を子プロセスに伝える所は納得しました。確かにコマンドラインオプションで伝えていくのは無駄ですね。
ありがとうございます!
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS HTMLの・要素・属性・属性値 はプログラム言語の「変数」みたいに変更できますか? 5 2022/10/04 05:27
- FTTH・光回線 AU光回線の速度が出ません 2 2022/07/30 16:05
- その他(IT・Webサービス) ホームページにカウント数を表示する 2 2022/10/28 10:37
- ルーター・ネットワーク機器 AU光10G回線について 6 2022/07/25 00:12
- サーバー Windows2019CALとRDS CALについて 1 2022/06/19 13:48
- 法学 特殊決議 (とくしゅけつぎ)について 2 2022/05/22 01:35
- ルーター・ネットワーク機器 家庭内LANで10GbE 3 2022/11/14 02:03
- その他(プログラミング・Web制作) dockerとは? 新しい配属先でテレワークになり、テレワーク用のpcにdockerを入れたのですが 2 2022/09/22 07:54
- ルーター・ネットワーク機器 通信量や通信量による影響を計算し想定できますか 3 2023/01/13 09:07
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/06/23 15:02
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
なぜ、No such file or directo...
-
/etc/inet/hostsの編集の反映に...
-
USBメモリからのソフトの自動起動
-
/private/etc/hostsがない
-
2台のWindowsでユーザー名を同...
-
hosts に 記載がなければ追加...
-
ユーザーを作成したのに、suで...
-
Photoshop7起動時に「カラー設...
-
ファイルのパーミッション
-
LANG="ja_JP.UTF-8"設定がサー...
-
chownでファイル所有者なのに別...
-
Macでrtf書類を開くアプリケー...
-
エクセルのファイルがダブルク...
-
texの使用に関してpathを通すと...
-
/etc/profileを編集する方法
-
hosts.allowとhosts.denyについて
-
10.3で不可視ファイルが!!
-
嫌ってるのに真似してきたりマ...
-
onedriveの中身を削除したらパ...
-
mrl→midファイルへ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
hosts に 記載がなければ追加...
-
Linuxを入れたばかりなのにタイ...
-
Scriptを教えて下さい。(10.4)
-
LANG="ja_JP.UTF-8"設定がサー...
-
~/.bash_profileがログイン時に...
-
VLC media playerを常にデフォ...
-
ward(mac)の<標準>ツールバー...
-
ラズパイのファイルのパーミッ...
-
Macでrtf書類を開くアプリケー...
-
chownでファイル所有者なのに別...
-
ドラック&ドロップ出来ない時...
-
Apache起動時に秘密鍵パスフレ...
-
BINDで独自ドメインの名前解決...
-
デスクトップの再構築?
-
【UNIX】/var/adm/wtmpx という...
-
jpgファイルが開かない
-
Wine 黒い画面
-
Fatal server error?
-
/etc/inet/hostsの編集の反映に...
-
Linuxでタブ補完を押したときの...
おすすめ情報