Zsh가 ~ / .profile을 누르지 않음


145

우분투 시스템에 zsh를 설치했습니다. zsh가 init에서 ~ / .profile을 실행하지 않는 것 같습니다. 가장 잘 이해하기 위해서는 이것이 자동적 인 행동이어야합니다. 내가 무엇을 놓치고 있습니까?

답변:


204

.profile vs. .zprofile

Zsh는 로그인 쉘로 호출 될 때가 ~/.zprofile아닌을 실행 ~/.profile합니다. 그 이유는 zsh에 표준 쉘과의 비 호환성이있어 스크립트를 깨뜨리기 때문입니다.

Zsh가 또는 ~/.profile로 호출되면 실행 됩니다 . 그러나 로그인 할 때 zsh 프롬프트를 표시하는 것이 목표라면 도움이되지 않습니다.shksh

당신은 할 수 있습니다 /bin/sh로그인 쉘과 등 export SHELL=/bin/zsh당신에 ~/.profile. 그런 다음 터미널을 열면 터미널이 zsh를 시작합니다 (일부 터미널 에뮬레이터가 $SHELL설정을 따르지 않는 경우 제외 ). 그러나 shssh를 통해 로그인 할 때 여전히 있습니다 . exec zsh마지막 에 포함하면이를 해결할 수 있습니다 ~/.profile(이는 실행중인 쉘을 zsh로 대체 함) ~/.profile. X 세션 시작과 같은 다른 스크립트에 포함 된 경우 가 아닌 대화식 로그인에 대해서만주의해야합니다. test는 다음에 의해 얻은 상위 프로세스의 이름입니다. 또는이 ps -o comm= $PPID경우 안전합니다 ).sshdsuexec

zsh 및 run과 함께 작동하는 가장 쉬운 솔루션 ~/.profile은 다음을 실행 ~/.zprofile하는 동안 sh 에뮬레이션 모드로 들어가는 것을 만드는 것 입니다 ~/.profile.

emulate sh
. ~/.profile
emulate zsh

최근에 충분한 zsh가 있다면 (우분투에서 명료 한 이래로 의미합니다) 이것을로 단순화 할 수 있습니다 emulate sh -c '. ~/.profile'.

.zprofile vs. .zshrc

파일 ~/.profile로그인 쉘에 의해로드됩니다 . 로그인 쉘은 텍스트 콘솔 또는 ssh를 통해 텍스트 모드로 로그인 할 때 시작되는 첫 번째 프로세스입니다. 기본적으로 대부분의 Linux 컴퓨터에서 로그인 셸은 bash이지만 chsh명령 또는 Ubuntu의“사용자 설정”과 같은 다른 도구를 통해 로그인 셸을 변경할 수 있습니다 . 로그인 쉘인 경우 bash는 ~/.bash_profile존재하고 및 ~/.profile이면 zsh는 읽기만합니다 ~/.zprofile(구문은 기존 sh와 완전히 호환되지 않기 때문에). 대부분의 구성 ~/.profile에서 그래픽 디스플레이 관리자에 로그인 할 때 X 세션 시작 스크립트에 의해로드됩니다.

터미널 에뮬레이터를 시작하고 셸 프롬프트를 받거나 셸을 명시 적으로 시작하면 로그인 셸이 아닌 셸이 나타납니다. ~/.profile(또는 ~/.zprofile)는 로그인 할 때 실행하려는 명령을위한 것이므로 로그인하지 않은 쉘은이 파일을 읽지 않습니다. 대신 대화식 zsh를 시작하면이 표시 ~/.zshrc됩니다. (Zsh ~/.zshrc는 로그인 쉘이 아닌지 여부에 관계없이 모든 대화식 쉘에서 읽습니다 . 이상하게도 bash ~/.bashrc는 로그인 쉘에서 읽지 않습니다 .)

일반적으로 ~/.profile환경 변수 정의가 포함되며 로그인하거나 전체 세션에 대해 한 번 실행하려는 일부 프로그램을 시작할 수 있습니다. ~/.zshrc별명 및 함수 정의, 쉘 옵션 설정, 완료 설정, 프롬프트 설정, 키 바인딩 등과 같은 모든 쉘 인스턴스에 대해 수행해야하는 작업이 포함되어 있습니다.


좋은 답변입니다! ~ / .zprofile을 만들고 제안한대로 줄을 넣었지만 아무것도하지 않는 것 같습니다. 아마도 .zshrc에 넣어야합니까?
shmichael

1
@shmichael : 귀하의 반응에 따라 귀하의 질문을 의도 한대로 해석하지 않았을 수 있습니다. 답변에 추가 한 두 번째 섹션이 도움이 되나요?
Gilles

예, 그 자리를 쳤다. 따라서 올바르게 이해하면 예를 들어 .zprofile에 대한 PATH 선언과 .zshrc에 대한 별칭을 원합니다.
shmichael

@ user1419674 수정 해 주셔서 감사하지만 게시물에 변경 로그를 추가하지 마십시오. 이 사이트에는 내장 된 개정 내역이 있습니다.
Gilles

69

참을성이없는 사람들을위한 짧은 대답 :

  1. ~/.profilezsh로그인 할 때로드되지 않습니다 .
  2. zsh~/.zprofile로그인시 로드합니다 .
  3. zsh부하는 ~/.zshrc새로운 터미널 세션을 시작할 때.

더 많은 정보가 필요하십니까? Gilles의 훌륭한 답변을보십시오!


좋은 대답입니다. 필요한 것만
Django Reinhardt

21

Gilles의 답변 외에도 합리적으로 최신 버전의 zsh를 사용하면 다음과 같이 할 수 있습니다.

[[ -e ~/.profile ]] && emulate sh -c 'source ~/.profile'

... zsh의 sh 모드로 .profile 파일을 소스로 제공합니다. 소스에서만 활성화됩니다. 따라서 소싱 후 다시 재생하기 위해 현재 옵션 상태를 저장할 필요가 없습니다.


나는 ~ / .zprofile에 이것을 가지고 있지만 어떤 이유로 ~ / .profile의 문장을 쉘에서 사용할 수 없습니다. 우분투 15.04; zsh 5.0.7
friederbluemle

코드없이 진단하기가 어렵습니다.
Frank Terbeck

방금 다시 시도했는데 지금 작동하는 것 같습니다. 어느 시점에서 수정되었는지 또는 어떤 일이 발생했는지 확실하지 않습니다. zsh 버전은 5.1.1입니다.
friederbluemle

5

나는 (PATH 변경 만 포함) .zprofile과 호환 .profile되므로 다음 만 필요합니다.

ln -s .profile .zprofile

0

zsh을의 I 손에있는 문서 만 언급 /etc/profile하고 ~/.profile있는 로그인 쉘에 대한 SH / KSH의 호환 모드.

% zsh --version
zsh 4.3.10 
% cat ~/.profile
echo 'Running ~/.profile...'

기본 모드 로그인 쉘 (argv [0]로 시작 -)은 사용하지 않습니다 ~/.profile( ~/.zprofile그렇지만 사용합니다 ).

% zsh -c 'exec -a -zsh zsh' </dev/null

(출력 없음)

SH / KSH의 호환성 모드 로그인 쉘의 .profile을 사용합니다 :

% zsh -c 'exec -a -sh zsh' </dev/null
Running ~/.profile...
% zsh -c 'exec -a -ksh zsh' </dev/null
Running ~/.profile...
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.