zsh, 실행 PATH 추가.

tldr;

전역 실행경로를 줄 때는 .zprofile 을 사용하라!


언젠가 문득 들어보기만 했던 zsh 를, 며칠 전 아래 글을 우연히 보고 설치를 해봤다.

첫 느낌은..
‘괜한 짓을 했구나..’
사용하는데 별 지장은 없지만, 그래도 좀 공부가 필요해 보였기 때문이다.
여러 새로운 기능들이 꽤 있어서, 그냥 대충 쓰기엔 조금은 무리가 있어 보인다.

그래도 조금씩 배워나가기로 하고 그냥 써보고 있었는데, 문제가 하나 터져버렸다.
$HOME/bin 에 넣어둔 파일을, .desktop 파일에서 실행하게끔 만들어놓은 게 있는데, .desktop 파일을 실행하면 $HOME/bin 에 넣어둔 파일을 찾질 못한다. 즉, 경로가 잡혀있지 않다는 얘기.

예를 들어, .desktop 파일에 이런 식으로 exec 를 설정했다면..

Exec=my_run %F

그리고 my_run$HOME/bin 에 있다고 하자.
이때, zsh 환경 하에서는 .desktop 파일이 실행되지 않고 오류가 발생한다. (물론, Exec 문에 전체 경로를 써주면 전혀 문제는 없다.)

하지만 경로는 넣어놓았는데??
연결된 글에도 살짝 언급을 하긴 했지만, zsh 에서 추가 경로는 이런 방식으로 넣어줄 수 있다.

  • $HOME/.zshrc
  • $HOME/.oh-my-zsh/custom/anyname.zsh
  • $HOME/.zprofile

.zshrc 에는 다음과 같은 행이 있다.
export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH
이 행의 주석처리를 지워주면 해당 경로가 실행 PATH 에 추가된다.

$HOME/.oh-my-zsh/custom/에 확장자가 .zsh 인 파일을 만들고 위 내용을 넣어줘도 된다.

그러나, .zshrc 와 .oh-my-zsh/custom 을 쓰는 방법으로는, 터미널을 직접 실행했을 경우엔 경로가 잡히지만, 그렇지 않은 상태에선, 즉 .desktop 을 실행한다든가 하는 상황에선 실행 경로가 잡히지 않는 오류(?)가 발생한다.
사실, 오류라기 보다는 한계다. 위 두 방법은 Interactive Shell 을 위한 설정이기 때문에, 저렇게 작동하는게 정상이긴 하다.

어쨌든, 원하는 결과를 얻기 위해선, .profile 에 경로를 넣어줘야 한다. 그러나, 그냥 .profile 엔 넣어줘도 아무 의미가 없다. zsh 가 .profile 을 무시하는 건지, 인식을 못하는 건지.
새 술은 새 부대에. zsh 엔 .zprofile 을.
내가 알아야할 모든 것은, 그 이름도 유명한 ArchLinux 문서에서 배울 수 있었다.

터미널, 즉 Interactive Shell 이 아닌, 로그인 한 전체 환경, 즉 Login Shell 에 작용하는 PATH 를 추가하기 위해서는 $HOME/.zprofile 파일에 경로를 넣어줘야 한다.
경로 뿐만이 아니라, 다른 환경 설정도 이 부분에 넣어줘야 한다.


2018.11.29 추가 (그러나 의미가 없었다.)

** 2019.03.13 추가
아래와 같이 생각을 했었으나, 여기엔 큰 문제(?)가 있다.
이 글을 쓸 때만 해도 잘 몰랐고, 이 상태로 한참을 썼는데, 나중에 확인해보니 PATH 가 중복되는 현상이 있었다.
export PATH=$HOME/bin:$HOME/.local/bin:/usr/local/bin:$PATH 이런 명령을 .zshenv 에 넣어놓으면, $HOME/bin 이 중복되는 현상이 나타난다.

echo $PATH
/home/neonkr/bin:/home/neonkr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

이런 식으로, /home/neonkr/bin 이 2번 중복이 된다. 만약 이 상태에서 zsh 를 한번 더 호출하면, 또 한번 중복이 된다.

이건, .zshenv 가, 매번 Shell 이 실행될때 마다 불러지기 때문이다.
.zshenv 에 다음과 같은 문구를 넣고 시험해봤다.

echo $(date +"%y%m%d-%H%M%S") >> $HOME/log_zsh
echo $PATH | grep kr/bin >> $HOME/log_zsh 
echo '\n' >> $HOME/log_zsh

.zshenv 가 실행될 때 마다, $HOME/log_zsh 에 실행시간과, $PATH 를 출력하라는 명령이다. log_zsh 를 실행한 결과는 다음과 같다.

190313-125218
/home/neonkr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

190313-125259
/home/neonkr/bin:/home/neonkr/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games

12:58:18 은 KDE Neon 시스템에 로그인한 시간이다. 터미널 로그인이 아닌 GUI(SDDM) 로그인이었고, 12:59:59 는 로그인 후 Konsole 을 호출한 시점이다.
최초 로그인 때는 ~/neonkr/bin 이 한번만 있었지만, Konsole 에서는 2번 반복돼있음을 확인할 수 있다.

결론은!!! 전역 실행경로를 줄 때는 .zprofile 을 사용하라!

아래 내용은 그냥 남겨놓기로 한다.


Learning Shell Scripting with ZSH p15 를 보니, zsh 가 실행될 때, 다음 순서로 설정을 불러온다고 한다.

  • zshenv
  • zprofile
  • zshrc
  • zlogin

그리고, zshenv 의 이름 그대로, 환경변수(PATH)등은, 여기에 넣으라고도 되어 있다. zprofile 에 넣어서 안되는 건 아니겠으나, 하라는대로 하는게 좋지 않겠나.

따라서, 전역 환경을 위해서 환경변수는 $HOME/.zshenv 에 넣기로 한다.

….

이렇게, 뭔가 막혔을 때 ArchLinux 문서의 도움을 받은 게 한 두번이 아니다. 그런데도 왜 매번 애매한 상황일 때는 구글부터 뒤지게 되는지.
구글 이래봤자 이런 문제로 검색했을 때 처음으로 나오는 결과는 주로 StackOverflow 자료들이 많은데, 거기는 유용한 자료들도 많지만 그렇지 못한 글들도 꽤 많아서, 이번 처럼 쓸 데 없이 시간만 낭비하게 되는 경우가 많았다.
다음엔 ArchLinux 부터 찾아보리라.. 다짐하지만, 아마도 다음에도 구글부터 열어보겠지..

Tags:,
2 Comments

안녕하세요. 글 남겨주셔서 고맙습니다.