Intro
Android/Flutter Installation에서 환경변수에 설정하는 부분이 있었다. 리눅스에서의 환경변수 설정과 bash shell에 대해 명확히 이해하지 않고 검색해서 이것저것 끼워넣다가 사고를 쳤다.
PATH가 제대로 등록되어 있지 않아 사용할 수 있는 명령어가 없었다. ls
, sudo
, apt
, int
, vi
등등… 죄다 사용이 불가능했다. 어찌저찌 실수한 부분을 찾아 수정하여 고쳐놓고 bash Shell과 Environment Variable, $PATH
에 대해 간략히 정리하고자 한다.
커널과 셸
Kernel: 커널
컴퓨터 과학에서 커널(kernel)은 컴퓨터의 운영 체제의 핵심이 되는 컴퓨터 프로그램의 하나로, 시스템의 모든 것을 완전히 통제한다. 운영 체제의 다른 부분 및 응용 프로그램 수행에 필요한 여러 가지 서비스를 제공한다.
초창기의 컴퓨터에서 운영 체제 커널은 필수적인 것이 아니었다. 초기의 프로그램은 하드웨어 추상화나 운영 체제의 지원을 받지 않고도 컴퓨터만으로 불러들인 다음 실행될 수 있었으며, 이것은 초창기 컴퓨터들의 일반적인 운영 방식이었다. 다른 프로그램을 실행하기 위해서는 컴퓨터의 전원을 껐다가 켬으로써 다시 입력자료를 읽어들여야 하는 방식이었다. 이러한 과정이 반복되면서 사람들은 로더와 디버거 같은 작은 프로그램들이 상주해 있는 것이, 다른 프로그램으로 교체하거나 새로운 프로그램을 개발하는 데 유리하다는 사실을 알게 되었다. 이와 같은 로더, 디버거들이 초기 운영 체제 커널의 기초가 되었다. …
사실 얼마든지 프로그램이 직접 하드웨어에 접근할 수 있겠지만 상술하였듯, 컴퓨터를 끄지 않고 여러가지 프로그램을 실행하려면 시스템 자원을 독점적으로 관리하고 필요에 따라 사용자 실행 프로그램에 할당 및 회수하는 프로그램이 필요했다. 이에따라 커널이라는, 운영체제의 일부로서 항상 컴퓨터 메모리에 상주하는 프로그램이 만들어졌다.
Shell: 셸
셸(shell)은 운영 체제 상에서 다양한 운영 체제 기능과 서비스를 구현하는 인터페이스를 제공하는 프로그램이다. 셸(껍데기의 영어 단어)은 사용자와 운영 체제의 내부(커널) 사이의 인터페이스를 감싸는 층이기 때문에 그러한 이름이 붙었다.
출처: Wikipedia: 셸
이렇게 체계화된 운영체제가 등장함에 따라 사용자가 운영체제/커널에 직접 접근해야할 상황이 생기면서 셸이 도입되었다.
윈도우에서 사용하는 셸로는 Command Prompt(CLI)나 PowerShell(CLI), 또는 파일탐색기(GUI)등이 있으며, 리눅스, 맥을 포함한 유닉스 계열에선 후술할 bash를 많이 사용한다.
Environment Variable: 환경변수
환경 변수(環境 變數,environment variable)는 프로세스가 컴퓨터에서 동작하는 방식에 영향을 미치는, 동적인 값들의 모임이다.
출처: Wikipedia: 환경 변수
상술한대로 셸이나 명령줄, 또는 기타 프로그램들에서 실행할때 참조하는 내용들을 변수로 만들어 동적으로 값을 수정할 수 있도록 만든 것이 환경변수이다.
예를 들면, Unix 계열 시스템에선 아래와 같은 환경변수들이 사용된다.
$PATH
: 디렉토리 경로 목록. 가령ls
,sudo
,apt
와 같은 명령어를 처리할 바이너리들이 있는 경로를 지정하지 않아도 PATH를 참조하여 해당 명령어를 처리할 바이너리들을 살펴본다.$HOME
: 사용자의 홈 디렉토리.$JAVA_HOME
(JDK사용시): JDK가 설치된 경로. 주로 JDK에 의존적인 프로그램들이 참조하기위해 등록한다.$SHELL
: 현재 사용중인 셸의 위치$TERM
: 사용되는 터미널(또는 터미널 에뮬레이터)의 유형
이 외에도 (Unix 또는 호환 계열 시스템에서) env
, set
등의 명령어를 통해 환경변수들을 확인해볼 수 있다.
현재 $PATH
에 등록된 경로들을 확인해보고 싶다면, 아래와 같이 입력해보자.
echo $PATH
bash
Bash is a Unix shell and command language written by Brian Fox for the GNU Project as a free software replacement for the Bourne shell.
Bash is a command processor that typically runs in a text window where the user types commands that cause actions. Bash can also read and execute commands from a file, called a shell script. Like all Unix shells, it supports filename globbing (wildcard matching), piping, here documents, command substitution, variables, and control structures for condition-testing and iteration. The keywords, syntax, dynamically scoped variables and other basic features of the language are all copied from sh. Other features, e.g., history, are copied from csh and ksh. Bash is a POSIX-compliant shell, but with a number of extensions.
출처: Wikipedia: Bash (Unix Shell)
뭐… 그렇단다.
Startup Script
bash Shell이 시작될때, 여러 Dot File에 기술된 명령들을 실행한다. 특히 환경변수를 등록하는 단계를 거치므로 환경변수 설정을 위해 이용해야할 부분이다.
/etc
경로 아래의 시작파일들은 전역, 모든 사용자에 영향을 끼치며, 홈디렉토리 ~/
아래 시작파일들은 지역, 해당 사용자에게만 영향을 끼친다.
‘profile’이 들어가는 파일들은 로그인쉘 생성시에만 (즉 계정 로그인시에만) 실행된다. 비로그인쉘 생성시에는 로그인쉘에서 불러온 환경변수들도 추가된다. 또한 ‘bashrc’가 들어가는 파일들을 호출한다.
‘bashrc’는 bash shell 생성시에 실행된다.
아래와 같이 다섯가지 파일들이 있다.
/etc/profile
: 전역, bash설정, 로그인 시 실행, (/etc/bash.bashrc
호출)/etc/bash.bashrc
: 전역, bash설정, bash shell 생성시 매번 참조~/.profile
(또는~/.bash_profile
,~/.bash_login
): 지역, bash 설정, 로그인시 실행~/.bash_logout
: 지역, 로그아웃시 실행~/.bashrc
: 지역, bash 설정, bash shell 생성시 매번 참조
$PATH
경로 설정시 주의사항
필자가 ADB PATH 설정시 실수로 $PATH
를 날려먹어서 $PATH
를 참조하는 모든 명령어가 먹통이었다. (정확히는 날려먹기보단 Override했다고 보는게 맞겠다…?)
지금 터미널을 열어 echo $PATH
명령을 실행하면 대충 아래처럼 $PATH
를 출력한다.
user@domain:~$ echo $PATH
/home/user/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
보다시피 경로들이 :
(Colon)으로 구분되고 있다. 때문에 /.bashrc
나 기타 시작파일에서 $PATH
변수에 경로를 추가하고 싶다면 아래와 같이 추가하여야 한다.
올바른 예시:
export PATH=$PATH:$HOME/Android/Sdk/platform-tools
잘못 된 예시:
export PATH=$HOME/Android/Sdk/platform-tools
올바른 예시의 경우 기존에 있던 $PATH
를 불러와 콜론과 함께 추가하고 싶은 경로를 이어붙인데 반해, 잘못된 예시는 이미 설정된 $PATH
는 싸그리 무시하고 위 경로 하나만 설정한 것이다.
이렇게 설정하면 기존 $PATH
가 참조하던 모든 명령어들을 사용할 수 없게된다. 물론 이 경우 제대로 참조하도록 수정한 후 Shell 재시작, 또는 재시작시 해결되나, 필자는 원인파악을 하지 못하고 한참 헤맸다. 그렇게 후술할 $PATH
를 날려먹은 경우 복구하는 방법을 찾아냈다.
$PATH
를 날려먹은 경우 복구하기
you can find it on /etc/environment:
$ /usr/bin/cat /etc/environment
PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
So, just source it:
$ source /etc/environment
$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
출처: askubuntu
당연히 있어야할 명령어를 입력했더니
Command not found
를 뿜어낸다면 진짜 해당 명령어를 실행시킬 파일이 사라진게 아닌 이상 $PATH
참조에 문제가 생겼다고 볼 수 있다. /etc/environment
에 참조해야할 경로들이 있으므로 source /etc/environment
를 사용해보라.
Outro
쓸 내용이야 많지만 정리하는데 시간이 오래걸려서 나머지 내용들은 그때그때 정리하고자 한다. 귀찮아
참고한 글들.
https://originalchoi.tistory.com/19
https://hwan-shell.tistory.com/100
https://askubuntu.com/questions/113419/how-can-i-reset-path-to-its-default-value-in-ubuntu
Wikipedia
https://ko.wikipedia.org/wiki/배시_(유닉스_셸)
https://ko.wikipedia.org/wiki/셸
https://en.wikipedia.org/wiki/Bash_(Unix_shell)