환경변수야 우리 그만하자

jj·2021년 7월 21일
3
post-thumbnail

파이썬을 처음 설치할 때에도 환경변수를 설정하라는 말을 많이 들어봤을 것이다.

아무것도 모르던 꼬꼬마 바보 멍청이 말미잘 개똥 보다 못한 나는 그런가보다 하고 했더랬다.

여기서 환경변수와의 악연은 끝일줄 알았더랬지....

그런데, 뭐만하면 환경변수 설정이 안되서 ImportError, CommandError 가 뜨는 것이다.

죽을까..

이제 진짜 악연의 고리를 끊어보도록 한다.....ㅈㅂ....

환경변수가 어려운 이유

  1. 이름에서 뭔가 감을 전혀 못잡겠다
    • "프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는 동적인 값들의 모임" 이라는 데, 이걸 처음에 듣고 알아먹는 사람은 천재라고 생각한다.
    • 환경+변수 라는 조악한 단어의 조합이 볼때마다 ptsd를 일으킨다....
  1. bashrc나 bash_profile을 열어서 무려 수정! 을 해야한다.
    • 분명히 환경변수 설정을 어려워하는 사람들은 vi 에디터를 많이 사용해보지 않은 사람일 것이다. 이런 사람들에게 무려 bash 파일을 열고! 글자를 입력해서! 수정!까지 하는 것은 심적으로 너무나 큰 부담이다.
    • 또한 bash나 bash_profile이 없는 나같은 경우에는 완전 혼돈의 도가니에 빠질 수 밖에 없다. 나는 맥유저인데, macOS의 catallina는 기본 쉘이 bash가 아니라 zsh(z shell이라고 읽는다. 나는 뭣도 몰라서 지-에스-에이치라고 읽었다;;) 을 쓴다. 그것도 모르고 bash 파일을 만들었다가 이게 맞나 지우고를 반복... 그러다가 갑자기 멀쩡히 먹혔던 커맨드들이 안먹으면 2차 멘붕... 다시는 환경변수를 쳐다보고 싶지도 않아진다.....
  1. 도대체 어떤 경로를 입력해야된다는 말인가...!!
    • 서치를 해보면 맨날 무슨 경로를 넣으면 된단다. 근데 파이썬이 어디 설치되어있는 지 몰랐던 과거의 나같은 사람은 export PYTHONPATH=$PYTHONPATH:/home/dev/python-files 이런 stackoverflow 답변을 보면 그냥 죽고 싶어진다...
  1. 그렇게 자주 나오는 문제는 아니라서, 한번 어찌저찌 해결하고 나면 다시 까먹는다
    • 분명히 저번에 이렇게 했던 것 같은데.... 왜 이번에는 안되지? 라는 진짜 지옥같은 상황이 펼쳐진다.
    • 특히, 주변에 물어볼 사람이 있어도, 이렇게 사소하고 쉬운걸 물어보는 게 미안하기도 하고, 또 2번째 물어보는 것이라면 더더욱 못 물어보게 된다.

환경변수를 설정하라는 스택오버플로우 답변을 볼때마다 느꼈던 좌절이 너무 많았어서, 감정이 격해져버렸다.

이제 하나씩 바로잡아보자.

1. 환경변수는 그냥 변수 이다.

파이썬에서 하나의 변수를 선언한다고 하자.

x = "variable"

로 선언하면 x를 출력했을 때, variable이 나오게 될 것이다

이처럼 unix 시스템의 쉘스크립트에서도 변수를 선언할 수 있다.

$ export x = "variable"

$echo $x
>> variable

x라는 변수를 불러올때는 $라는 문자를 앞에 붙여줘야한다.

그러나, 이렇게 단순하게 지정한 환경변수는, 현재의 바로 "이" 터미널 창에서만 유효한 변수로 동작하고, 만약 새 터미널 창을 열었다면, 유효한 변수로 동작하지 않는다. 오래 두고 쓸 변수라면, 이 터미널이 기억할 수 있도록 어딘가에 적어주어야 한다는 것이다. 전역(global)변수로 설정해준다고 생각하면 된다.

특히 이 글에서 말하고 있는 path 환경변수의 경우, 운영체제가 어떤 프로세스를 실행시킬 때, 그 경로를 찾는데에 활용된다. 쉽게 말해, 내가 파이썬을 쓸건데, 그 파이썬이 어디있는지를 운영체제에게 알려줘서 실행시킬 수 있도록 "파이썬으로 향하는 길(경로)"를 알려주는 것이다.

그래서, 이 환경변수를 어디에 적어주느냐? 바로 bashrc 나 bash_profile (혹은 zshrc) 파일이다.

2. ~/.bashrc vs ~/.bash_profile

bash

Bash shell은 커맨드 쉘의 일종이다. 쉘이 무엇이냐 하면, 운영체제에서 사용자가 입력하는 명령을 읽고 해석하여 대신 실행해주는 프로그램이다. 사용자와 운영체제의 커널사이의 인터페이스를 감싸는 층이라서 쉘이라는 이름이 붙었다. 그러니까 bash는 결국 내가 입력한 명령을 해석해서 대신 실행해주는 애라는 것이다. 만약 ls 라는 명령어를 입력하면, 현재 디렉토리에 있는 모든 파일과 폴더를 보여줄것이고, 내부 명령어가 아니면 Path 환경변수에 지정된 경로에서 입력받은 명령과 같은 파일을 찾아 실행해준다.

이 bash 쉘에는 공통적인 5개의 설정 파일을 가지고 있다.

  • /etc/profile : 전역적인 시스템 설정 관련

  • /etc/bashrc : alias(별칭)과 bash가 수행될때 실행되는 함수를 제어하는 전역적인 시스템 설정과 관련된 파일

  • ~/.bash_profile : 환경변수와 bash가 수행될 때 실행되는 프로그램을 제어하는 지역적인 시스템설정과 관련 -> 이 환경변수들은 오직 그 사용자에게만 한정되고 다른 사람에게는 영향을 미치지 않는다.

  • ~/.bashrc : alias와 bash가 수행될 때 실행되는 프로그램을 제어하는 지역적인 시스템설정과 관련 ->모든 사용자에게 영향을 주는 /etc/bashrc 와는 달리, ~/.bashrc 는 오직bash를 실행하는 사용자에게만 영향을 준다

  • ~/.bash_logout: 사용자가 로그 아웃하기 바로 직전에 실행하는 프로그램에 관한 bash의 지역적인 시스템 설정과 관련된 파일

=> 그래서 우리가 환경변수를 설정할 때 bash profile을 열어서 수정해야되는 것이다

bashrc에 환경변수를 넣는 경우도 본것같은데, 그 이유는 아직 잘 모르겠다..

여기서 . 로 시작하는 애들은 숨김파일이라고 생각하면 된다.

여기서 지역적인 파일은 사용자 개개인을 위한 설정 내용을 담고 있어서 그 파일을 사용하는 특정 사용자에게만 영향을 끼치는 파일들을 뜻한다.

전역적인 파일은 bash를 사용하는 모든 사용자에게 영향을 주는 설정 내용을 담고 있는 파일을 말하며, 일반적으로 전역적인 파일은 /etc 디렉토리에 위치한다.

bashrc는 bash가 실행될때마다 수행되고(non-login shell), bash_profile은 bash가 login_shell로 쓰일때(예: ssh로 접속해서 처음 로그인 할 때) 수행된다.

zshrc

zsh도 bash와 같은 shell의 한 종류이다. zsh을 쓰는 경우에는 bashrc와 bash_profile처럼 구분해서 쓸 필요는 없다. login이든 non-login이든 상관없이 실행되기 때문.

3. 경로 찾기

리눅스의 mv, cp, rm 같은 시스템 명령어는 /bin에 저장되어있다

/usr/bin/에는 일반 유틸리티나 파이썬 등의 프로그래밍 언어 실행 스크립트 등 대부분의 사용자 명령어가 위치해 있다. 그리고 /usr/local/bin에는 사용자가 실행하는 프로그램 명령어들이 저장되는 곳이다.

PATH

path변수는 사용자가 직접 접근할 수 있는 디렉토리를 의미한다. 만약 내가 bin/foo 를 실행시키고 싶은데, /bin이 나의 PATH에 없다면, foo를 실행시키기 위해서는 /bin/foo라고 전체 경로를 입력해주어야한다.

나의 zshrc 파일에서 아무 path 변수를 긁어와 봤다. 진짜 도대체 뭐가 뭔지 해석이 불가능하다. 그이유는 바로 경로 중간중간에 있는 : 때문이다.

export PATH=/opt/homebrew/bin:/Users/jeongjaewon/opt/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

예를 들어 다음과 같은 경로가 있다고 하자

PATH=/bin:/usr/bin:/usr/local/bin

이 경로는 : 를 기준으로 3개의 경로로 나뉘어진다 => /bin,/usr/bin , /usr/local/bin

새로운 path 변수를 만들때는 현재의 path변수를 새로운 path에 더해야한다.

PATH=$PATH:/usr/games

로 설정하면, 기존에 이미 설정된 PATH 변수의 뒤에 /usr/games가 붙게 된다.

($PATH는 우리가 이미 설정한 변수를 불러오기 때문에) PATH변수는/bin:/usr/bin:/usr/local/bin:/usr/games로 확장된다.

이것을 알고 다시 위로 돌아가면

export PATH=/opt/homebrew/bin:/Users/jeongjaewon/opt/anaconda3/bin:/Library/Frameworks/Python.framework/Versions/3.9/bin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin

현재 나의 PATH변수는 총 6개의 경로로 확장된 것을 알수 있다.

다시 말해, PATH=$PATH:폴더를 쓰면 다른 경로에 설치된 명령어도 전역으로 사용이 가능해진다. 순서를 바꾸고 싶다면 PATH=폴더:$PATH로 쓰면 될것이다.

이렇게 편집을 끝내고 나면

bashrc를 실행시켜 환경변수를 적용시켜줘야한다!

source ~/.bashrc
source ~/.zshrc

예를 들면...

파이썬 경로를 환경변수에 적용시키고 싶다면

$ which python3
>> /Users/jeongjaewon/opt/anaconda3/bin/python3
$ vi ~/.bashrc
# bashrc 가장 밑으로 가서 (i 입력 )
export PATH=/Users/jeongjaewon/opt/anaconda3/bin/python3:$PATH
# 를 쓰고 나온 뒤(!wq)
$ source ~/.bashrc
# 를 하면 끝이라는 것이다

그래도 한번 정리해놓으니 마음이 편안해진다.
이제 나를 다시는 찾지므르...

References

https://r4bb1t.tistory.com/69

https://jongmin92.github.io/2016/12/13/Linux%20&%20Ubuntu/bashrc-bash_profile/

https://originalchoi.tistory.com/19 <- 가장 큰 도움을 받았습니다. 감사합니다 !_!

https://vnthf.github.io/blog/bash/

profile
재밌는게 재밌는거다

0개의 댓글