저는 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
소스 코드를 얻을 수 있습니다.~/.zshenv
zsh
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
하지 않습니다.