web-dev-qa-db-ja.com

gnome / nautilusから実行されたBashスクリプトには、環境変数がありません

〜/ .bashrcと〜/ .profileには、いくつかの変数がいくつかのファイルパスに設定されています。

export MY_VAR1="/path/to/somewhere"

〜/ bin /(PATHに追加されます)には、設定されている変数に依存するスクリプトがいくつかあります。

これらのコマンドをターミナルから実行すると、期待どおりに機能します。

ただし、Nautilusでスクリプトをダブルクリックして実行しようとすると、それらの変数が設定されていないかのように実行されます。

GUIユーティリティを使用してGnomeの「スタートアップアプリケーション」にスクリプトの1つを追加した場合、または「メインメニュー」GUIユーティリティを使用してGnomeメニューにスクリプトを追加した場合も、同じことが起こります。

ログイン時に実行される〜/ .profileにこれらの変数を含めたので、gnomeとnautilus、およびそれらによって生成されたプロセスがこれらの変数にアクセスできると思いました。

GnomeとNautilusの両方が私のログインユーザーの下で実行されます。 〜/ bin内のすべてのスクリプトでは、上部にbashShebangがあります。

私はbashスクリプトを初めて使用します。明らかな何かが欠けている場合は、申し訳ありません。私はDebianWheezyとGnome3を使用しています。

6
Felix Mc

これは、開始Xセッションが~/.bashrc~/.profileを読み取らないためです。通常、デスクトップマネージャーは、initスクリプトからrootまたは独自のユーザーとして起動されます。結果として得られるプロセスは、通常、デスクトップマネージャーの開始スクリプトに到達したときのinitプロセスの環境を持っています。 (この時点では、確立されていないinit実装については説明しません。)

ログイン後、その環境だけを継承する子プロセスを生成します。子プロセスはuidに特権をドロップし、/etc/X11/Xsessionを実行します。これは通常、/etc/X11/Xsession.d内のすべてのスクリプトを実行するだけです。これらのスクリプトは通常、環境変数を設定するか、具体的にはデスクトップ環境の呼び出しを変更します。

そのディレクトリには、Debianシステム上の40x11-common_xsessionrcのようなファイルがあり、~/.xsessionrcをソースしています。 /etc/X11/Xsession.dの最後のファイルは、デスクトップ環境を開始します。すべてのGUIプロセスはこのプロセスから生成されるため、/etc/X11/Xsession.dを介して設定された環境を継承し、その結果、~/.xsessionrcを継承します。

~/.xsessionrcはスクリプトファイルであり、~/.bashrcをソースする可能性がありますが、これは本当に悪いスタイルです。DEがソースを取得すると、ターミナルプロセスがその環境を継承し、~/.bashrcを再度bashする可能性があります。望ましくない副作用があります。

ただし、厳密に(環境)変数定義を含み、~/.myenvironmentvariablesおよび~/.bashrcによって供給される~/.xsessionrcを持つことは完全に許容されます。これを行うと、すべてのプロセスが~/.myenvironmentvariablesで指定された変数、特にNautilusでダブルクリックしたシェルスクリプトを継承します。

7
Bananguin