シェルは、Linux上のすべてのプロセスの親プロセスです。

シェルは、Linux上のすべてのプロセスの親プロセスです。

私はシェルの範囲と環境についてより深く理解しようとしてきました。export VARIABLE=VALUE 私はこれを行うと、サブシェルでどのように使用できるかについて読みました。だから思い浮かぶ質問を1つお願いします。

私が正しく理解したら、スクリプトファイルを介してバイナリプログラムを実行すると、Linux(debian仮定)で端末を介して設定された環境変数がスクリプトファイルで実行されているすべてのプログラムに表示されるため、環境変数を表示できます。

だから私の質問と混乱は、すべてのシェルの親であるシェルが1つあるということです。階層構造が少し混乱しています。 Debian で端末を開き、 と入力すると、export VARIABLE=VALUEデスクトップをダブルクリックして実行しても、すべてのスクリプトファイルに表示されますか?

私の質問はあいまいではなく、サーバーの障害に適していることを願っています。

答え1

シェルかどうかにかかわらず、すべてのプロセスは階層を形成します。親プロセスが子プロセスの環境を管理するために明示的なアクションをとらない限り、環境変数は親プロセスから子プロセスに渡されます。ほとんどのシステムでは、initこのプロセスはプロセスツリーのルートにありますが、組み込み環境などの状況は異なる場合があります。実行すると、pstree -aツリー内のすべてのプロセスが表示されます。

子プロセスで設定した環境変数は親プロセスまたは兄弟プロセスに伝播されないため、ターミナルウィンドウから変数をエクスポートすると、そのウィンドウ内で開始されたプロセスにのみ影響します。したがって、あなたの質問に対する答えは「いいえ」です。

答え2

いいえ、X11セッションの子プロセスとして実行されるシェルは、デスクトップをダブルクリックして起動するプロセスの親(または祖先)になるX11セッションの環境を変更できません。

一般的な回避策は、いくつかの構成メカニズムに接続し、必要な設定をインポートする方法でダブルクリック可能なツールを作成することです。これはホームディレクトリの設定ファイルであるか、ある種の設定デーモンです。最新のX11デスクトップ環境はこれらの機能をデフォルトで実行しますdbus

もちろん、これはこれらの機能を使用できる環境で実行するように特別に設計されたツールにのみ役立ちます。通常、Javaプログラムにシステム全体の構成ファイルを読み取らせることができます。たとえば、/etc/eat_memory_and_crash.confJavaプログラム名があるとしますeat_memory_and_crash。 Javaエコシステムでは、このファイルがXMLファイルであると想定しています。

関連情報