문제 발생
리눅스계열의 OS에서 환경변수 설정을 하다, 잘못 건드리면, ls, vi 등과 같이 우리가 사용하는 기본 명령어를 인식 못할때가 있다.
# macOS의 경우 (z shell)
zsh: command not found: ls
# ubuntu의 경우 (bash shell)
bash: ls: command not found
이번 글에서는 어떻게 하다가 위의 문제가 발생했는지, 그리고 어떻게 하면 해결할 수 있는지를 확인해보도록 하자.
MacOS기준
macOS 또한 리눅스 계열의 일종이므로 사실상 다른 리눅스(ubuntu, centOS)등에서 거의 똑같이 해결 가능하다.
환경 변수 설정 (문제가 발생한 원인)
# Home Driectory (Prompt에 ~ 로 시작)
thlee@thleeui-MacBookAir ~ % ls -ial
# Result
25495221 -rw------- 1 thlee staff 25246 10 19 14:22 .zsh_history
284506 drwx------ 27 thlee staff 864 10 19 14:22 .zsh_sessions
25492413 -rw-r--r-- 1 thlee staff 314 10 19 13:49 .zshrc
Linux계열의 환경 변수 설정은 각 쉘의 rc파일 (run commands)에서 작성하도록 되어 있다. 해당 파일은 숨김파일로 되어 있다(맨 앞에 .으로 시작함) z-shell : .zshrc / bash-shell : .bashrc
thlee@thleeui-MacBookAir ~ % vim ~/.zshrc
vim 편집기를 많이 사용하고 있기때문에 vim ~/ (현 디릭토레 경로)에서 .zshrc를 열겠다는 명령어를 친다.
export PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin"
그림1에서 처럼 마지막에 python환경 변수 설정을 하고 싶어서 위와 같이 PATH를 설정했다.
thlee@thleeui-MacBookAir ~ % source ~/.zshrc
그리고 해당 환경 변수를 적용하기 위해 source 명령어를 (source ~/.zshrc) 이와 같이 입력했다.
thlee@thleeui-MacBookAir ~ % python3
Python 3.11.6 (v3.11.6:8b6ee5ba3b, Oct 2 2023, 11:18:21) [Clang 13.0.0 (clang-1300.0.29.30)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>>
오.. python3라고 하니까 python script창이 실행되었다. /Library/Frameworks/Python.framework/Versions/3.11/bin 경로에 있는 python3 실행파일이 작동한 것이다.
(command not found : 문제 발생)
그런데, 이때부터 ls명렁어나 vim 명령어가 먹지 않기 시작했다.
thlee@thleeui-MacBookAir ~ % ls
zsh: command not found: ls
thlee@thleeui-MacBookAir ~ % vim ~/.zshrc
zsh: command not found: vim
아니 이러면 .zshrc / .bashrc에서 환경변수를 다시 수정을 못하잖아..!?
(문제 발생 이유)
ls, vim, vi, kill 등은 모두 실행파일임을 알아야한다. 단지, OS에서 환경변수 설정을 해서 shell에서 그냥 ls, vim만 쳐도 해당 프로그램을 실행할 수 있었던거다.
그런데, 우리가 export PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin"를 적용함으로써 환경변수의 경로를 바꿔버렸다. 더 이상 ls, vi, vim을 찾을수가 없는 것이다. 따라서 환경변수 경로를 다시 바꿔주면 된다.
(문제 해결 방법)
그런데 .zshrc에 못들어가는데 경로 수정을 어떻게 하면 될까?
우선, echo명령어 리눅스 및 유닉스 셸에서 제공하는 내장 명령어이므로, 현재 PATH경로를 보도록 하자
echo $PATH
/Library/Frameworks/Python.framework/Versions/3.11/bin
예상한대로 python만 실행 가능한 OS가 되어있다. 이를 export명령어를 이용해서 바꿔보도록 하자.
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
위와 같이 : 을 구분자로 이용해서 /usr/local/bin, /usr/bin, /bin, /usr/sbin, /sbin 총 5개 경로를 설정해줌으로써 기본 프로그램들을 사용할수 있게 해줘야 한다. 어떤 프로그램들이 있는지는 각자 경로에 가보도록 하자. 예를 들어 /sbin 안에는 mount관련된 명령어들이 있고 /bin안에는 ls와 같은 명령어가 있다.
thlee@thleeui-MacBookAir ~ % export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
thlee@thleeui-MacBookAir ~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.11/bin
위와 같이 export명령어를 통해 PATH를 다시 바꿔주고 echo명령어로 OS 환경변수 경로인 PATH를 확인해보니 아래와 같이 잘 되어 있는 것을 확인할 수 있다. 그런데, 뭔가 이상하지 않은가? 뒤에 이전에 설정했던 Python환경 변수가 그대로 살아 있다.
여기서, export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH" 마지막에 붙어 있는 :$PATH의 용도가 나온다.
새로운 환경 변수 경로 뒤 :$PATH의 의미 이해 (중요)
환경 변수 경로 설정에서 대부분의 경우 기존의 환경 변수 경로를 유지하면서 새로운 경로를 추가하고 싶은 경우가 대부분이다. 단일 경로만 설정한다고 해서 기본/기존의 환경 변수 설정이 사라지면, 사용자 입장에서 불편해 사용하기 힘들 것이다. 따라서 기존 환경 변수를 유지하면서 새로운 경로를 추가하는 방법이 필요했고, 각 환경 변수 경로사이에 : 로 구분하게 된 것이다. 여기서 $는 현재 환경 변수를 참조하는 기호로, PATH 환경 변수의 값을 가져오는 역할을 한다. 이제 이 위의 예제를 이용해 해석해보자.
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
설명: "{새로운 경로}:$PATH" = "{새로운 경로}:{기존 경로}" 즉 기존경로를 뒤에 유지하면서, 새로운 경로를 추가하겠다는 의미가 된다.
{/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin : 새로 추가한 경로 }:{/Library/Frameworks/Python.framework/Versions/3.11/bin : 기존의 경로}
내가 잘못해서 단일 경로로 python경로 추가한 것에 기본 경로를 추가적으로 추가해줌으로써 정상화 시켜준 것이다.
이제 위와 같이 ls명령어가 다시 수행되기 시작했다. 이제, 다시 shell-rc파일 .zshrc, .bashrc파일에 들어가서 변수 설정을 다시해야한다. 수정 안하고 source로 적용하게 되면, 또 기본 경로가 사라지게 될것이다.
결론 요약
만약, 위의 설명이 필요한게 아니라 그냥 결과만 필요하다면, 아래 export를 shell창에 치면 된다. 사라졌던, 기본 명령어 경로를 맨 앞에 추가해 주는 것이다.
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
이후 .zshrc / .bashrc들어가서 내가 추가하고 싶은 경로에 뒤에 :$PATH를 추가하면 된다.
앞으로 어떤 경로를 환경변수로 설정하고 싶다면, 꼭 $PATH를 경로에 넣어주도록 한다. 참고로 꼭 뒤에 넣어줄 필요는 없고
"$PATH:{새로운 경로}" = "{기존 경로}:{새로운 경로}"
앞에다 넣어줘도 상관 없다. 무엇을 먼저 보느냐만 달라질 뿐이다. 다만 뒤에 붙이는걸 권장한다. 내가 명령어를 칠때 OS입장에서는 PATH에 존재하는 경로를 순서대로 찾기때문에 기본 명령어가 뒤로 밀릴수록 속도가 느려질수도 있기때문이다.
'웹 개발 > OS (Win : Linux) 설정' 카테고리의 다른 글
CMD (명령 프롬프트)창에서 D드라이브로 이동 방법 : Windows (0) | 2024.10.15 |
---|