[기본 지식]
원래 유닉스 or 리눅스 시스템 상에서는
쉘에서 파일의 '경로명'을 모두 입력해줘야 프로그램이 실행된다.
하지만 흔히 사용하는 프로그램 도구들 (ex. vi Editor, vim.. env 등등)은
vi , vim , env만 쳐도 실행 되는데
그 이유가 실행 파일이 주어지면 쉘은
'PATH' 환경변수에 있는 디렉토리에서 실행파일을 알아서 찾아준다.
이 때 경로명들을 콜론(:)으로 구분해서 가지고 있다.
ex) /usr/bin:/etc:/usr/local/bin: (중략)
이러한 경로 목록을 검색 경로(Search Path) 라고 한다.
:콜론 왼쪽에 있는 것 부터 순차적으로 찾아나간다.
고로 "따로 경로명을 제시 하지 않은" 실행 파일은
- PATH에 등록된 디렉토리에서 먼저 찾아보고
- PATH에 등록된 모든 디렉토리 내에 해당 파일이 없으면 실행되지 않는다.
EX) JAVA 개발을 위한 JDK를 설치한 경우 환경변수 설정을 해줘야 javac를 이용해 컴파일 할 수가있다.
원래는 실제 실행파일이 존재하는 경로 C:\Program Files\Java\jdk-12.0.1\bin 디렉토리로 이동하거나
직접 전체 경로 C:\Program Files\Java\jdk-12.0.1\bin\javac 를 입력해야 하는데
환경변수에 javac 파일이 들어있는 "C:\Program Files\Java\jdk-12.0.1\bin" 경로를 미리 정의함으로써
실행 파일명인 "javac"만 입력해도 PATH 로 부터 javac 파일을 찾아 실행한다.
'javal'이란 명령어가 먹히지 않는건
환경변수 내에 등록된 모든 디렉토리를 찾아본 결과 'javal'이란 파일이 존재 하지 않기 때문이다.
javac명령어가 먹히는건 C:\Program Files\Java\jdk-12.0.1\bin을 뒤져보니 javac 파일이 발견됐기 때문이다.
Linux 환경 변수 지정 방법
1회성 환경변수 설정
$export env_name=value // export 환경변수명=값
※ 리눅스 쉘은 = 사이에 공백을 허용하지 않는다.
환경변수 이름 목록보기
$ env | grep name
또는
$ echo $name
영구적으로 환경변수 적용
(1) 시스템 환경 변수 적용
모든 사용자에게 적용된다.
bash.bashrc 파일로 이동!
$ vim /etc/bash.bashrc
이 내에 모든 사용자에게 환경변수를 영구적 등록할 수 있게함
맨 상단 or 맨 하단에
export env_name=value 추가
수정한 내용 적용
$ source /etc/bash.bashrc
또는
$ ./etc/bash.bashrc
(2) 사용자 환경 변수 적용
현재 로그인 된 User 에게만 적용된다.
$ vim ~/.bashrc
# 맨 하단에 원하는 환경변수명=값 추가
export env_name=value
수정 내용 적용
$ source ~/.bashrc
환경변수 해제
$ unset env_name
/etc/bash.bashrc , ~/.bashrc 모두 같은 환경 변수 지정하면 어떻게 될까?
~/.bashrc 값으로 override 된다.
적용 순서는 다음과 같다.
- /etc/bash.bashrc 실행
- ~/.bashrc 실행
~/.bashrc 가 나중에 실행되므로 `/etc/bash.bashrc` 에서 지정한 환경변수 값을 override 한다.
테스트 결과
$ vim /etc/bash.bashrc
# 마지막 라인에 추가
export myname=vladimir
echo "I'm bash.bashrc"
# 변경 내역 적용
$ source /etc/bash.bashrc
$ vim ~/.bashrc
# 마지막 라인에 추가
export myname=Garen
echo "I'm ~/.bashrc"
# 변경 내역 적용
$ source ~/.bashrc
sudo -s 로 shell을 실행시키면 다음과 같은 결과가 나온다
시스템 환경 변수를 등록하는 bash.bashrc 가 먼저 적용되고, ~/.bashrc 가 실행되고
최종적으로 myname 은 ~/.bashrc 의 값으로 override 된다.
alias
실행 명령에 대한 별명을 지정할 수 있다.
명령어 입력시 검색 경로보다 alias 를 먼저 찾는다.
Shell 은 alias -> 검색 경로 (PATH) 등록 순서대로 실행시킬 파일을 찾는다.
alias 와 검색 경로에 실행시킬 파일이 없는 경우 'No Such file or directory' 에러가 발생한다.
Shell이 아무것도 없이 마법처럼 실행 파일을 찾는게 아니다.
Windows 환경 변수 지정 방법
제어판 > 환경 변수에 추가한다.
<<사진 첨부>>
환경 변수는 크게 2가지가 존재한다.
User 환경 변수
특정 사용자가 사용하는 환경 변수
'현재 로그인한 User' 에게만 적용되는 변수
System 환경 변수
시스템내 모든 사용자에게 적용될 환경 변수
전체 User 에게 적용되는 변수
같은 환경 변수가 User/System 에 모두 정의되면 어떻게되나?
User 환경 변수 값으로 override 된다.
그러나 `PATH` 는 예외다.
PATH 우선순위
System PATH 가 User PATH 보다 우선권을 갖는다.
Windows 에서 PATH 는 다음과 같이 정의된다.
Path = %Path% (System) ; %Path% (User)
즉, System 환경변수 `PATH` 목록을 먼저 다 불러온 후 뒤에 User `PATH` 목록을 append 한다.
CLI 로 실행파일 실행 시, PATH 에서 가장 먼저 발견된 실행파일 기준으로 실행하기 때문에, User PATH가 존재하더라도 System PATH 가 실행된다.
OS PATH는 왜 이렇게 우선순위가 거꾸로일까?
System PATH 는 컴퓨터를 사용하는데 필요한 필수 프로그램들의 경로가 담겨있다.
유저가 User PATH 를 마음껏 override 하더라도, 필수 프로그램은 변함 없이 사용될 수 있도록 하게 하기 위함이다.
(탐색기 같은 프로그램의 경로가 User PATH 업데이트에 의해 마구 변경된다고 상상해보라)
그래서 PATH = {System PATH}:{User PATH} 순서로 append 된다.
User PATH 가 추가되어도 System PATH 값을 먼저 찾아 사용하게 된다.
References
https://www.baeldung.com/cs/user-vs-system-variables
'LINUX > Linux' 카테고리의 다른 글
하드 링크 , 심볼릭 링크 개념과 간단한 실험예제 (0) | 2019.06.06 |
---|---|
lstat, stat (0) | 2019.06.06 |
환경변수 PATH에 현재 디렉토리 '.'을 추가하면 안되는 이유? (0) | 2019.06.06 |
GNU Compiler 실행 ./ (0) | 2019.06.01 |
Alias (0) | 2019.06.01 |