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 설정을 다룬 아래 글도 함께 참고하면 좋다.)

윈도우 Python 설치 + 환경변수(PATH) 설정 — 'python' 명령어 인식 안 될 때
윈도우에서 Python을 설치하고 시스템 환경변수(PATH)에 설치 경로와 Scripts(pip) 경로를 등록해, cmd에서 'python'·'pip'만 입력해도 실행되게 하는 과정. USER/SYSTEM 변수 차이와 pip로 설치한 라이브러리의 site-packages 구조까지 정리.
taystudios.com/blog

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를 연다.

.zshrc에 export PATH로 Python 경로를 설정한 화면 그림 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에서 환경변수를 다시 수정할 수조차 없다.

왜 발생했나?

/bin 디렉터리 내의 ls·pwd·kill 등 실행 파일 목록 그림 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개 경로를 추가해 기본 프로그램을 다시 쓸 수 있게 한다. (예: /binls, /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"  =  "{새 경로}:{기존 경로}"

즉 기존 경로를 뒤에 유지하면서 새 경로를 앞에 추가한다는 의미다.

PATH 복구 후 ls 명령이 다시 동작하는 화면 그림 3. 원상복귀된 환경변수 경로

이제 ls가 다시 동작한다. 단, 이건 현재 셸 세션에만 적용된 임시 복구다. .zshrc/.bashrc에 들어가 설정을 제대로 고쳐야 한다. 안 고치고 다시 source하면 또 기본 경로가 사라진다.

결론 요약

설명이 필요 없고 결과만 필요하다면, 셸에 아래를 입력하면 사라졌던 기본 명령어 경로가 맨 앞에 복구된다.

export PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$PATH"

이후 .zshrc/.bashrc에서 추가하고 싶은 경로 뒤에 :$PATH를 붙이면 된다.

.zshrc에 새 경로:$PATH 형태로 최종 설정한 화면 그림 4. 기존 경로 추가 (최종)

앞으로 어떤 경로를 환경변수로 추가하든 꼭 $PATH를 함께 넣자. 꼭 뒤일 필요는 없다.

"$PATH:{새 경로}"  =  "{기존 경로}:{새 경로}"

앞에 넣어도 되며 탐색 순서만 달라진다. 다만 뒤에 붙이는 것을 권장한다. OS는 PATH의 경로를 순서대로 탐색하므로, 기본 명령어가 뒤로 밀릴수록 탐색이 느려질 수 있다.


같은 OS 설정 카테고리의 Windows 편(CMD 드라이브 이동)도 참고하자.

Windows CMD에서 D드라이브로 이동하는 방법 (cd가 안 될 때)
Windows CMD에서 cd로는 다른 드라이브로 못 넘어간다. C:에서 D 드라이브로 이동하려면 'D:'를 입력해야 하는 이유 — 드라이브마다 독립 루트를 갖는 Windows 파일시스템과 단일 루트(/)인 Linux의 구조 차이.
taystudios.com/blog

📦 이 글은 제가 운영하던 티스토리 블로그에서 옮겨온(migration) 글입니다. 원문: taehyuklee.tistory.com/22

이 글 공유𝕏f

댓글