내 로그인 셸이 zsh인데도 lightdm이 내 .profile을 가져오는 이유는 무엇입니까?

내 로그인 셸이 zsh인데도 lightdm이 내 .profile을 가져오는 이유는 무엇입니까?

저는 Linux Mint 19.2 Cinnamon을 사용하고 있으며 ZSH를 사용자의 로그인 셸로 사용하고 있습니다.

로그인하면 모든 ZSH 시작 스크립트에서 한 번만 지정되었음에도 불구하고 내 항목이 두 번 $PATH포함된 것으로 표시됩니다 .$HOME/.local/bin$HOME/.zshenv

다른 도트 파일을 살펴본 결과 다음 $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의 문서에 or 로 .profile호출될 때만 sh"호환성" 모드로 전환된다고 나와 있기 때문에 이는 놀라운 일입니다.ksh

Zsh가 각각 sh 또는 ksh로 호출될 때 sh 또는 ksh를 더 정확하게 에뮬레이션하려고 시도합니다. 첫 번째 "r"을 제외하고 호출된 이름의 첫 글자를 확인합니다("restricted"를 나타내는 것으로 가정). ) , "b", "s" 또는 "k"인 경우 sh 또는 ksh를 에뮬레이트합니다. 또한 su로 호출되면(일부 시스템에서 su 명령을 통해 쉘을 실행할 때 발생함) 쉘은 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

답변1

~에서Arch-Linux 위키 페이지lightdm(내 생각엔 이것이 Linux Mint의 상황에도 적용될 수 있을 것 같습니다):

에서 마이그레이션하는 경우 xinit셸에서 디스플레이가 시작되지 않는다는 것을 알 수 있습니다. 이는 디스플레이를 시작하는 쉘과 달리(그리고 디스플레이는 쉘의 환경을 상속함) LightDM이 디스플레이를 시작하고 쉘을 가져오지 않기 때문입니다. LightDM은 래퍼 스크립트를 실행하여 디스플레이를 시작하고 마지막으로 그래픽 환경을 실행합니다. 기본적으로 /etc/lightdm/Xsessions.conf실행합니다.

환경 변수

스크립트는 /etc/profile, ~/.profile, /etc/xprofile및 을 순서대로 확인합니다. ~/.xprofile사용 중인 셸이 이러한 파일을 제공하지 않는 경우 ~/.xprofile이를 수행하기 위한 셸을 생성할 수 있습니다. (이 경우 로그인 쉘은 zsh)

~/.xprofile


#!/bin/sh
[[ -f ~/.config/zsh/.zshenv ]] && source ~/.config/zsh/.zshenv

따라서 래퍼 스크립트가 시작될 때 수행하는 작업 ~/.profile이므로 파일 소스를 가져오십시오 . lightdm위키텍스트에는 또 다른 것이 있습니다zsh사용자의 구체적인 예여기에는 ~/.zshenv귀하의 제품을 에서 소싱하는 것이 포함됩니다 ~/.xprofile.

예제의 -line은 #!파일이 소스로 제공되므로 필요하지 않기 때문에 의미가 없으며 우선 순위를 지정하는 것이 더 합리적이므로 구문 분석 순서를 올바르게 얻었는지 궁금합니다 ~/.xprofile( ~/.profile즉, ~/.profile전혀 읽지 마십시오. 존재합니다 ~/.xprofile).

이 위키의 제안 사항이 효과가 없다면 읽는 동안 다음을 사용하여 ~/.profile소스 코드를 얻을 수 있습니다.~/.zshenvzsh

case $SHELL in (*/zsh) . "${ZDOTDIR:-$HOME}/.zshenv"; return ;; esac

또는

if [ "$SHELL" = "/usr/bin/zsh" ]; then
    . "${ZDOTDIR:-$HOME}/.zshenv"
    return
fi

그 위에.

답변2

누군가에게 도움이 된다면: zshenv출처는 .xsessionrc. 분명히 에 의해 실행되므로 /bin/sh명령은 다음과 같아야 합니다.dash(POSIX) 규격:

if test "${SHELL##*/}" = "zsh" ; then
  # shellcheck disable=SC1091
  test -r /etc/zsh/zshenv && . /etc/zsh/zshenv
fi

특히 [[ ... ]]작동 source하지 않습니다.

관련 정보