1 minute read

계기

습관적으로 ~/.bashrc 파일에 넣곤 한다. 그런데 또 어떤 설정은 ~/.bash_profile 에 넣으라고 안내가 나온다. 왜 저기에 넣어라고 하는 걸까? 둘 중에 그냥 되는 넣고 있었다. 하지만 최근 정리할 필요가 있다고 생각했다. Zsh로 메인 shell을 바꾸려는 게 계기가 됐다. Zsh로 넘어가더라도 Bash를 쓸 일이 있을 수도 있고 대부분 호환되는만큼 같이 쓸 수 있게 정리를 하고 싶다.

Bash startup files 로딩 순서

로딩 순서에 관해 설명한 좋은 글을 찾았다. Zsh/Bash startup files loading order (.bashrc, .zshrc etc.) 글에서 설명한 도표다.

  Interactive login Interactive non-login script
/etc/profile A    
/etc/bash.bashrc   A  
~/.bashrc   B  
~/.bash_profile B1    
~/.bash_login B2    
~/.profile B3    
BASH_ENV     A
~/.bash_logout C    

여기서 scriptnon-interactive login shellnon-interactive non-login shell 을 의미한다. bash 스크립트 파일을 실행한다든지 해서 사용자 입력을 받을 수 있는 프롬프트(prompt)가 뜨지 않는다면 non-interactive shell이다. 이런 경우엔 BASH_ENV 환경 변수만 사용한다. 난 여기서 처음 본다. 해당 환경 변수를 세팅해 본 적도 없다.

즉, 말 그대로 script 파일을 실행하면 설정 파일을 evaluation 하지 않고 BASH_ENV 환경 변수만 사용한다.

interactive는 말 그대로 non-interactive의 반대다. 사용자 입력을 받을 수 있는 프롬프트가 뜬 shell이다. macOS에서 터미널을 열면 interactive login shell로 열린다. 그래서 interactive non-login shell을 의도적으로 사용해 본 적이 없다. 물론 interactive login shell을 띄운 다음에 bash 프로그램을 --login 인자를 주지 않고 실행하면 interactive non-login shell을 실행할 수 있다. 지금 이 작업부터는 non-login shell로 해야 하니 bash 를 인자없이 실행해서 작업해야겠다. 이렇게는 한 번도 해본 적이 없다. 또한 지금 shell이 login 인지 아닌지를 의식하며 써본 적도 없다.

이럴 땐 어떻게 하면 될까? 표준이 있다면 표준을 따라간다. 없으면 대세를 따라간다. 모든 설정을 ~/.bashrc 에 몰아놓고 ~/.bash_profile 에서 ~/.bashrc 파일을 evaluation하게 한다. 설정 관리도 편하게 할 수 있고 login, non-login 둘 다 똑같은 설정으로 사용할 수 있다. non-interactive shell로 실행할 때는 예전에도 신경을 안 썼던 것처럼 앞으로도 신경을 안 쓰려고 한다. 그래서 BASH_ENV 환경 변수의 존재는 빠르게 까먹을 작정이다.

정리

~/.bashrc 파일에 bash 설정에 관한 모든 걸 넣는다.

아래와 같은 코드로 ~/.bash_profile 파일에서는 ~/.bashrc 파일을 evaluation 한다.

if [ -f ~/.bashrc ]; then . ~/.bashrc; fi

BASH_ENV 존재는 잊는다.

링크