파이썬을 처음 설치할 때에도 환경변수를 설정하라는 말을 많이 들어봤을 것이다.
아무것도 모르던 꼬꼬마 바보 멍청이 말미잘 개똥 보다 못한 나는 그런가보다 하고 했더랬다.
여기서 환경변수와의 악연은 끝일줄 알았더랬지....
그런데, 뭐만하면 환경변수 설정이 안되서 ImportError, CommandError 가 뜨는 것이다.
죽을까..
이제 진짜 악연의 고리를 끊어보도록 한다.....ㅈㅂ....
export PYTHONPATH=$PYTHONPATH:/home/dev/python-files
이런 stackoverflow 답변을 보면 그냥 죽고 싶어진다...환경변수를 설정하라는 스택오버플로우 답변을 볼때마다 느꼈던 좌절이 너무 많았어서, 감정이 격해져버렸다.
이제 하나씩 바로잡아보자.
파이썬에서 하나의 변수를 선언한다고 하자.
x = "variable"
로 선언하면 x를 출력했을 때, variable이 나오게 될 것이다
이처럼 unix 시스템의 쉘스크립트에서도 변수를 선언할 수 있다.
$ export x = "variable"
$echo $x
>> variable
x라는 변수를 불러올때는 $라는 문자를 앞에 붙여줘야한다.
그러나, 이렇게 단순하게 지정한 환경변수는, 현재의 바로 "이" 터미널 창에서만 유효한 변수로 동작하고, 만약 새 터미널 창을 열었다면, 유효한 변수로 동작하지 않는다. 오래 두고 쓸 변수라면, 이 터미널이 기억할 수 있도록 어딘가에 적어주어야 한다는 것이다. 전역(global)변수로 설정해준다고 생각하면 된다.
특히 이 글에서 말하고 있는 path 환경변수의 경우, 운영체제가 어떤 프로세스를 실행시킬 때, 그 경로를 찾는데에 활용된다. 쉽게 말해, 내가 파이썬을 쓸건데, 그 파이썬이 어디있는지를 운영체제에게 알려줘서 실행시킬 수 있도록 "파이썬으로 향하는 길(경로)"를 알려주는 것이다.
그래서, 이 환경변수를 어디에 적어주느냐? 바로 bashrc 나 bash_profile (혹은 zshrc) 파일이다.
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로 접속해서 처음 로그인 할 때) 수행된다.
zsh도 bash와 같은 shell의 한 종류이다. zsh을 쓰는 경우에는 bashrc와 bash_profile처럼 구분해서 쓸 필요는 없다. login이든 non-login이든 상관없이 실행되기 때문.
리눅스의 mv, cp, rm 같은 시스템 명령어는 /bin에 저장되어있다
/usr/bin/에는 일반 유틸리티나 파이썬 등의 프로그래밍 언어 실행 스크립트 등 대부분의 사용자 명령어가 위치해 있다. 그리고 /usr/local/bin에는 사용자가 실행하는 프로그램 명령어들이 저장되는 곳이다.
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
# 를 하면 끝이라는 것이다
그래도 한번 정리해놓으니 마음이 편안해진다.
이제 나를 다시는 찾지므르...
https://jongmin92.github.io/2016/12/13/Linux%20&%20Ubuntu/bashrc-bash_profile/
https://originalchoi.tistory.com/19 <- 가장 큰 도움을 받았습니다. 감사합니다 !_!