web-dev-qa-db-ja.com

開いているすべてのターミナルで「.profile」を「ソース」にする必要があるのはなぜですか?

Ubuntuで~/.profileの変数を変更したら、source .profileコマンドを実行します。その後、変更は有効になりますのみこのターミナルで。新しいターミナルを開く場合は、source .profileコマンドを再度実行する必要があります。したがって、同じユーザーに属している場合でも、異なる端末には独自の環境があるようです。

すべての端末に独自の環境パスを持たせることの利点は何ですか?同じユーザーに属している別の端末が同じ環境変数を共有していると良いと思われます。

9
cainiaofei

これは、~/.profileがログインシェルからのみ提供されるためです。新しいターミナルウィンドウを開くと、起動するシェルはデフォルトでは非ログインシェルです。ログアウトしてから再度ログインすると、~/.profileへの変更がすべての端末で有効になります。セッションにログインすると~/.profileが取得されるためです。

端末ウィンドウごとに環境が異なるわけではありませんが、~/.profileをソースにすると、現在のシェルで~/.profileのみが実行されます(これはsourceコマンドの動作です)。

対照的に、~/.bashrcへの変更は、すべてのインタラクティブなBashシェルから供給されるため、開く新しいターミナルウィンドウ、またはbashと入力して開始するBashシェルにすぐに影響します。

14
Zanna

環境変数は、ユーザー設定だけではありません。これらは、親プロセスから開始する子プロセスにさまざまな設定情報を伝達するための一般的なメカニズムです。

プロセスが開始するプロセスに影響を与えるために特定の環境変数を設定するケースは多数ありますjust。たとえば、スクリプトは、スクリプトからの出力を解析できるように、開始するコマンドのロケール設定を意図的にリセットする場合があります。多くの大きなソフトウェアパッケージのビルドスクリプトは、makeのネストされた呼び出しを使用し、環境変数を介して相互に調整します。特殊なツールは、$ LD_PRELOADまたは$ PATHでトリックを行うことにより、起動する他のプログラムの動作条件を変更する必要がある場合があります。

長いコンパイルが別のウィンドウで実行されている間にユーザーが別のウィンドウで何かをすると、魔法のようにallプロセスの環境変数が変更され、狂気と混乱が生じるでしょう。

他の環境変数には、プロセスが開始される特定のセッションに関する情報が含まれます。プログラムは、$ TERMが接続先の特定の端末(または端末エミュレータ)のコマンドセットを記述することを想定しています。一般的なユーザーごとの設定を行うと、いくつかの異なる種類の端末で同じシステムにログインできなくなります。端末ハードウェアが1つしかなく、リモートでログインしない場合でも、screenなどのプログラムは、セッション内で実行されるプロセスに異なる$ TERMを設定することに依存します。

より良い質問は、なぜユーザーごとのデータベースではなく、ユーザー設定のプロセスにプロセス間通信メカニズムを使用するのでしょうか?

回答:十分に機能するであり、ユーザーごとのデータベースを作成するメリットは、everything環境変数の代わりにthatを使用します。

(私は、ではない環境設定が非常に少ないと考えることができます。単一のスクリプトを実行するためにそれらを変更するのが便利なユースケースがあるたとえば、機能を失わないためには、すべてが環境変数によってoverrideableである必要があり、その結果、複雑さが増し、ユーザーが混乱します。

代替が存在しないexistのようではありません。たとえば、Xリソースはプロセスごとではなく、ディスプレイセッションごとです。ただし、コマンドラインプログラムではアクセスが困難です-通常、コマンドラインプログラムは、have接続するXサーバー。

3
Henning Makholm