web-dev-qa-db-ja.com

シェルは環境変数をどのように/どこに保存しますか?

つまり、$ PWD、$ PATH、$ USERNAMEなどがあります。私は自分のシェルに取り組んでおり、今日、環境変数を導入しました。私がそれをしている方法は、pwd、pathなどと呼ばれる文字列を作成することです。たとえば、$ PWDをエコーするコマンドがある場合は、pwdを出力するように指示します。これはbashと同じことですか?環境変数を設定するためのプロビジョニングはまだありませんが、それに取り組むつもりだと思います。私の主な質問は、実際のシェルがどこでどのようにそれを行うかということです。

もう1つのやや関連する質問ですが、printenvはこれらすべてにどのように関連していますか? printenvはバイナリであり、常にbash環境変数を出力するため、最初に実行するために現在使用しているシェルではありません(明らかに、パスとして設定したプログラム内の文字列をどのように検出するのでしょうか)。およびpwd)では、これらはどこから取得されますか?

2
GNU Geek

シェルは、環境変数を任意の方法で格納できます。それは実際には関係ありません。関連するのは、シェルがprintenvシステムコールを介して環境を子プロセス(execveを含む)に渡すことができる必要があるということです。

4
Johan Myréen

man 7 environを参照してください。シェルが別のプロセスを実行すると(任意のフレーバーでexec(3))、そのプロセスは前のプロセスの環境を継承します。シェルの便利な設計の1つは、エクスポートされたシェル変数とエクスポートされていないシェル変数の2つのリストを保持することです。エクスポートされたものは、putenv(3)を使用してシェル自体の環境で維持され、シェルが作成するすべてのプロセスによって自動的に継承されます。エクスポートされないものは、シェルのみがアクセスできる別のリストにある可能性があります。

この種のことが興味深い場合は、Michael KerriskによるLinuxプログラミングインターフェイスが役立つリファレンスです。

2
James K. Lowden