Bash startup files - 설정을 어디에 넣어야 하는걸까?
계기
습관적으로 ~/.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 |
여기서 script
는 non-interactive login shell
과 non-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
존재는 잊는다.