為什麼即使我的登錄 shell 是 zsh,lightdm 也會獲取我的 .profile?
我正在使用 Linux Mint 19.2 Cinnamon,ZSH 作為我的使用者的登錄 shell。
當我登錄時,我看到我的
$PATH
包含$HOME/.local/bin
兩次,即使它在我的所有 ZSH 啟動腳本中僅指定一次(在 中$HOME/.zshenv
)。我查看了我的其他點文件,發現了in
$HOME
的違規修改:$PATH``$HOME/.profile
# set PATH so it includes user's private bin if it exists if [ -d "$HOME/.local/bin" ] ; then PATH="$HOME/.local/bin:$PATH" fi
這很令人驚訝,因為 ZSH 的文件說
.profile
,當它被呼叫為sh
or時,它僅來源於“兼容”模式ksh
:當 Zsh 分別被呼叫為 sh 或 ksh 時,它會嘗試模擬 sh 或 ksh;更準確地說,它查看呼叫它的名稱的第一個字母,不包括任何首字母“r”(假設代表“restricted”),如果是“b”、“s”或“k”將模擬 sh 或 ksh。此外,如果作為 su 呼叫(當 shell 由 su 命令執行時在某些系統上發生),shell 將嘗試從 SHELL 環境變數中查找替代名稱並基於該名稱執行仿真。
我
.profile
通過在其末尾附加以下幾行來檢查其來源:logger "Opened .profile with this shell: $SHELL" PARENT_COMMAND=$(ps -o args= $PPID) logger "Parent command: $PARENT_COMMAND"
註銷並重新登錄後,系統日誌包含以下內容:
Opened .profile with this shell: /usr/bin/zsh Parent command: lightdm --session-child 13 20
即使我是 ZSH,導致顯示管理器
lightdm
獲取源的事件順序是什麼,其背後的基本原理是什麼?.profile``$SHELL
來自Arch-Linux Wiki 頁面
lightdm
(我想這也可能適用於您在 Linux Mint 中的情況):如果您從 遷移
xinit
,您會注意到顯示不是由您的 shell 啟動的。這是因為,與您的 shell 啟動顯示(以及繼承您的 shell 環境的顯示)相反,LightDM 啟動您的顯示並且不獲取您的 shell。LightDM 通過執行包裝腳本啟動顯示,最後執行您的圖形環境。預設情況下,/etc/lightdm/Xsessions.conf
執行。環境變數
腳本按順序檢查和來源
/etc/profile
、~/.profile
和。如果您使用的 shell 不提供任何這些文件的來源,則可以創建一個來執行此操作。(在本例中,登錄 shell 是)/etc/xprofile``~/.xprofile``~/.xprofile``zsh
~/.xprofile
#!/bin/sh [[ -f ~/.config/zsh/.zshenv ]] && source ~/.config/zsh/.zshenv
因此,請獲取您的
~/.profile
文件,因為這就是包裝腳本lightdm
在啟動時所做的事情。wiki 文本還為*使用者提供了一個**特定範例,zsh
*其中包括~/.zshenv
從~/.xprofile
.該
#!
範例中的 -line 沒有多大意義,因為文件是來源的,因此不應該需要它,我想知道他們是否得到了正確的解析順序,因為優先考慮~/.xprofile
(~/.profile
即不要)如果存在~/.profile
,則根本不閱讀)。~/.xprofile
如果該 wiki 中的建議不適合您,您可以
~/.profile
在~/.zshenv
閱讀時zsh
使用case $SHELL in (*/zsh) . ~/.zshenv; return ;; esac
或者
if [ "$SHELL" = "/usr/bin/zsh" ]; then . ~/.zshenv return fi
在它的頂部。