Linux 'command not found' (ls·vi·vim) 해결 — PATH 환경변수 복구
문제 발생
리눅스 계열 OS에서 환경변수 설정을 하다 잘못 건드리면, ls·vi 같은 기본 명령어를 인식하지 못할 때가 있다.
# macOS의 경우 (zsh)
zsh: command not found: ls
# Ubuntu의 경우 (bash)
bash: ls: command not found
이 글에서는 어쩌다 이 문제가 발생했는지, 그리고 어떻게 해결하는지를 살펴본다. (환경변수(PATH) 개념이 처음이라면, Windows에서의 PATH 설정을 다룬 아래 글도 함께 참고하면 좋다.)
macOS도 리눅스 계열의 일종이므로, 다른 리눅스(Ubuntu·CentOS)에서도 거의 똑같이 적용된다. 여기서는 macOS(zsh) 기준으로 설명한다.
1. 환경변수 설정 — 문제가 발생한 원인
# Home Directory (프롬프트에 ~ 로 시작)
thlee@MacBookAir ~ % ls -ial
# 결과 (일부)
-rw------- 1 thlee staff 25246 .zsh_history
drwx------ 27 thlee staff 864 .zsh_sessions
-rw-r--r-- 1 thlee staff 314 .zshrc
리눅스 계열의 환경변수 설정은 각 셸의 rc 파일(run commands)에 작성한다. 이 파일은 숨김 파일(맨 앞 .)이다. zsh는 .zshrc, bash는 .bashrc.
thlee@MacBookAir ~ % vim ~/.zshrc
vim으로 홈 디렉터리(~)의 .zshrc를 연다.
그림 1. 환경 변수 설정
export PATH="/Library/Frameworks/Python.framework/Versions/3.11/bin"
그림 1처럼 Python 환경변수를 설정하고 싶어 위와 같이 PATH를 설정했다. 그리고 적용을 위해 source 명령을 입력했다.
thlee@MacBookAir ~ % source ~/.zshrc
thlee@MacBookAir ~ % python3
Python 3.11.6 (...) on darwin
>>>
python3를 치니 Python 인터프리터가 실행됐다. /Library/Frameworks/Python.framework/Versions/3.11/bin 경로의 python3 실행 파일이 작동한 것이다.
2. command not found 발생
그런데 이때부터 ls·vim이 먹지 않기 시작했다.
thlee@MacBookAir ~ % ls
zsh: command not found: ls
thlee@MacBookAir ~ % vim ~/.zshrc
zsh: command not found: vim
이러면 .zshrc/.bashrc에서 환경변수를 다시 수정할 수조차 없다.
왜 발생했나?
그림 2. /bin 디렉터리 내의 ls·pwd·kill 등 실행 파일
ls·vim·vi·kill 등은 모두 실행 파일이다. 단지 OS가 환경변수(PATH)에 그 경로를 갖고 있어서, 셸에서 ls만 쳐도 실행됐던 것이다.
그런데 export PATH="/Library/.../3.11/bin"을 적용하며 PATH를 통째로 덮어써 버렸다. 더 이상 ls·vi·vim을 찾을 수 없게 된 것이다. 따라서 PATH를 다시 바로잡으면 된다.
3. 문제 해결
.zshrc에 못 들어가는데 어떻게 경로를 수정하지?
echo는 셸 내장 명령이라 PATH와 무관하게 동작한다. 현재 PATH를 확인해 보자.
echo $PATH
/Library/Frameworks/Python.framework/Versions/3.11/bin
예상대로 Python 경로만 남아 있다. export로 기본 경로를 다시 추가한다.
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
:을 구분자로 /usr/local/bin·/usr/bin·/bin·/usr/sbin·/sbin 5개 경로를 추가해 기본 프로그램을 다시 쓸 수 있게 한다. (예: /bin에 ls, /sbin에 mount 관련 명령이 있다.)
thlee@MacBookAir ~ % export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
thlee@MacBookAir ~ % echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/Library/Frameworks/Python.framework/Versions/3.11/bin
그런데 뒤에 이전 Python 경로가 그대로 살아 있다. 여기서 맨 뒤 :$PATH의 역할이 드러난다.
:$PATH의 의미 (중요)
환경변수는 대부분 기존 경로를 유지하면서 새 경로를 추가하고 싶은 경우가 많다. 단일 경로만 설정해 기존 PATH가 사라지면 불편하므로, :로 경로를 구분해 이어붙인다. $는 현재 환경변수 값을 참조하는 기호로, $PATH는 기존 PATH 값을 가져온다.
"{새 경로}:$PATH" = "{새 경로}:{기존 경로}"
즉 기존 경로를 뒤에 유지하면서 새 경로를 앞에 추가한다는 의미다.
그림 3. 원상복귀된 환경변수 경로
이제 ls가 다시 동작한다. 단, 이건 현재 셸 세션에만 적용된 임시 복구다. .zshrc/.bashrc에 들어가 설정을 제대로 고쳐야 한다. 안 고치고 다시 source하면 또 기본 경로가 사라진다.
결론 요약
설명이 필요 없고 결과만 필요하다면, 셸에 아래를 입력하면 사라졌던 기본 명령어 경로가 맨 앞에 복구된다.
export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"
이후 .zshrc/.bashrc에서 추가하고 싶은 경로 뒤에 :$PATH를 붙이면 된다.
그림 4. 기존 경로 추가 (최종)
앞으로 어떤 경로를 환경변수로 추가하든 꼭 $PATH를 함께 넣자. 꼭 뒤일 필요는 없다.
"$PATH:{새 경로}" = "{기존 경로}:{새 경로}"
앞에 넣어도 되며 탐색 순서만 달라진다. 다만 뒤에 붙이는 것을 권장한다. OS는 PATH의 경로를 순서대로 탐색하므로, 기본 명령어가 뒤로 밀릴수록 탐색이 느려질 수 있다.
같은 OS 설정 카테고리의 Windows 편(CMD 드라이브 이동)도 참고하자.
📦 이 글은 제가 운영하던 티스토리 블로그에서 옮겨온(migration) 글입니다. 원문: taehyuklee.tistory.com/22


댓글