backend

Linux environment: 환경변수

seul chan 2020. 12. 17. 22:30

11. The environment

shell은 세션의 정보를 environment로 유지한다.

이는 크게 두가지로 나눌 수 있는데, environment variableshell variable

bash에 의해서 만들어진 데이터를 shell variable이라고 부르고 나머지 전부는 environment variable이다.

이와 더불어 몇몇 정보는 aliasesshell functions에도 저장한다. shell function은 책의 나중에 다룰 예정 (shell scripting)

env를 보는 방법은 printenv, set이 있다.

printenv는 environment variable을 모두 보여주고 set 명령어는 shell과 env 변수를 모두 보여준다.

어떻게 environment가 세팅되는지

로그인시, bash 프로그램은 startup files라고 불리는 몇몇 설정 스크립트를 읽는다.

보통 shell 세션은 두가지 방법으로 시작되는데,

  • login shell session: prompt에 username, password를 입력하고 로그인하는 방식. 보통 virtual console (ssh) 세션을 시작하면 이렇게 시작된다. (대부분의 서버)
  • non-login shell session: 보통 gui에서 터미널을 열면 이렇게 시작된다. (대부분의 pc)

시작되는 방법에 따라 읽는 startup file이 다르다.

로그인 세션은 다음 파일들을 읽는다

  • /etc/profile: 모든 유저에게 적용되는 global configuration script
  • ~/.bash_profile: 유저의 개인적인 startup file. global configuration script를 덮어씌울때 사용된다.
  • ~/.bash_login: ~/.bash_profile이 없으면 읽으려고 시도
  • ~/.profile: ~/.bash_profile, ~/.bash_login이 둘 다 없으면 읽기 시도. 몇몇 debian 기반 배포판에서 기본

non-login 세션은 다음 파일을 읽는다.

  • /etc/bash.bashrc: global configuration script
  • ~/.bashrc: 유저의 개인적인 startup file.

~/.bashrc가 대부분 읽히기 때문에 유저의 관점에서는 아마 가장 중요한 startup file일 듯. non-login shell은 이를 기본으로 읽고, login shell 도 대부분의 startup file 안에서 ~/.bashrc를 읽는다.

~/.bash_profile을 열어보자.

# .bash_profile

# Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

# User specific environment and startup programs

PATH=$PATH:$HOME/.local/bin:$HOME/bin

export PATH

위에 ~/.bashrc 파일이 있으면 읽는 코드가 있기 때문에 대부분의 서버에서 login shell에서도 ~/.bashrc가 적용되는 것.

그 다음은 PATH. 명령줄에서 실행 파일을 실행시키면 shell이 명령어를 찾아내는 방식.

shell은 명령어를 입력 받으면 PATH 변수에 있는 디렉토리 리스트에서 해당 명령어를 찾는다.

PATH 변수는 대부분의 경우 /etc/profile startup file에서 다음 코드로 설정된다.

PATH=$PATH:$HOME/bin

이는 parameter expansion을 사용한 구문으로 아래 예시를 따라해보면 이해가 쉽다.

root@d44964688ad2:/# foo="this is some "
root@d44964688ad2:/# echo $foo
this is some
root@d44964688ad2:/# foo=$foo"text."
root@d44964688ad2:/# echo $foo
this is some text.

이 테크닉을 사용하여 variable의 내용의 끝에 새로운 텍스트를 추가할 수 있다.

위에 $PATH:$HOME/bin이 추가되어 홈 디렉토리의 ~/bin 안의 실행파일이 실행되는 것.

어떤 파일을 수정해야할까?

서버에서는 ~/.bash_profile을, 로컬에서는 ~/.bashrc (주로 ~/.zshrc)를 수정하기 일쑤였는데, 책에서는 PATH를 추가하거나 새로운 환경변수를 정의할 때에는 ~/.bash_profile을, 나머지 다른 것들은 .bashrc에 추가하라고 한다.