Bash

為什麼即使我的登錄 shell 是 zsh,lightdm 也會獲取我的 .profile?

  • November 16, 2019

我正在使用 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,當它被呼叫為shor時,它僅來源於“兼容”模式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

在它的頂部。

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