본문 바로가기
웹 개발/OS (Win : Linux) 설정

command not found : ls, vi, vim 이유 설명 (기본 명령어 인식 문제 / 찾지 못할때)

by TayLee 2024. 10. 19.
반응형

문제 발생

리눅스계열의 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를 열겠다는 명령어를 친다.

 

fig1
그림1. 환경 변수 설정

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에서 환경변수를 다시 수정을 못하잖아..!? 

 

(문제 발생 이유)

fig2
그림2. /bin 디렉토리 내의 ls, pwd, kill 등의 실행 파일

 

 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경로 추가한 것에 기본 경로를 추가적으로 추가해줌으로써 정상화 시켜준 것이다. 

fig3
그림3. 원상복귀 된 환경변수 경로

 

 이제 위와 같이 ls명령어가 다시 수행되기 시작했다. 이제, 다시 shell-rc파일 .zshrc, .bashrc파일에 들어가서 변수 설정을 다시해야한다. 수정 안하고 source로 적용하게 되면, 또 기본 경로가 사라지게 될것이다.

 

 

결론 요약

만약, 위의 설명이 필요한게 아니라 그냥 결과만 필요하다면, 아래 export를 shell창에 치면 된다. 사라졌던, 기본 명령어 경로를 맨 앞에 추가해 주는 것이다.

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

 

 

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

fig4
그림4. 기존 경로 추가 (최종)

 

앞으로 어떤 경로를 환경변수로 설정하고 싶다면, 꼭 $PATH를 경로에 넣어주도록 한다. 참고로 꼭 뒤에 넣어줄 필요는 없고 

 

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

 

 앞에다 넣어줘도 상관 없다. 무엇을 먼저 보느냐만 달라질 뿐이다. 다만 뒤에 붙이는걸 권장한다. 내가 명령어를 칠때 OS입장에서는 PATH에 존재하는 경로를 순서대로 찾기때문에 기본 명령어가 뒤로 밀릴수록 속도가 느려질수도 있기때문이다.

반응형