Bash

從 gnome/nautilus 執行的 Bash 腳本沒有環境變數

  • March 22, 2018

在我的 ~/.bashrc 和 ~/.profile 我有一些變數設置為一些文件路徑:

export MY_VAR1="/path/to/somewhere"

在我的 ~/bin/ (添加到我的 PATH 中)中,我有一些腳本依賴於設置的這些變數。

如果我從終端執行這些命令,它們會按預期工作。

但是,如果我嘗試在 Nautilus 中點兩下腳本並執行它,它會像未設置這些變數一樣執行。

如果我使用 GUI 實用程序將其中一個腳本添加到 Gnome 的“啟動應用程序”,或者使用“主菜單”GUI 實用程序將它們添加到 Gnome 菜單,也會發生同樣的事情。

我會認為,由於我將這些變數包含在我的 ~/.profile 中,該文件在登錄時執行,因此 gnome 和 nautilus 以及由它們產生的程序將可以訪問這些變數。

Gnome 和 Nautilus 都在我的登錄使用者下執行。我在 ~/bin 中的所有腳本在頂部都有 bash shebang。

我是 bash 腳本的新手,如果我遺漏了一些明顯的東西,我很抱歉。我正在使用 Debian Wheezy 和 Gnome3。

那是因為開始的 X 會話從不讀取您的~/.bashrcand ~/.profile. 通常,桌面管理器以 root 或其自己的使用者身份從 init 腳本啟動。生成的程序在遇到桌面管理器啟動腳本時通常具有 init 程序的環境。(此時我不會談論不太成熟的 init 實現。)

登錄後,它會生成一個子程序,該程序僅繼承該環境。子程序將權限授予您的 uid 並執行/etc/X11/Xsession,它通常只是簡單地執行/etc/X11/Xsession.d. 這些腳本通常要麼設置環境變數,要麼專門修改桌面環境的呼叫。

在該目錄中,您可能會找到類似40x11-common_xsessionrcDebian 系統上的文件,該文件來源您的~/.xsessionrc. 最後一個文件/etc/X11/Xsession.d將啟動您的桌面環境。您的所有 GUI 程序都將從該程序中生成,從而繼承通過設置的環境,從而繼承/etc/X11/Xsession.d您的~/.xsessionrc.

~/.xsessionrc是一個腳本文件,它可能是源文件,~/.bashrc但這種風格真的很糟糕,因為你的 DE 源文件,終端程序繼承該環境,然後~/.bashrc再次 bash 源文件,這可能會產生不必要的副作用。

但是,完全可以接受 a ~/.myenvironmentvariables,它包含嚴格(環境)變數定義並且由~/.bashrcand提供~/.xsessionrc。如果這樣做,您的所有程序都將繼承 中指定的變數~/.myenvironmentvariables,尤其是您在 Nautilus 中點兩下的 shell 腳本。

引用自:https://unix.stackexchange.com/questions/170156