PATH Environment Variables는 명령어를 찾아주는 중요한 역할을 담당하고 있습니다. 이는 리눅스뿐만 아닌 윈도우에서도 명령어를 찾을 때 PATH Environment Variables를 이용합니다. PATH Environment Variables의 설정을 변경해 보면서 어떻게 동작하는지 알아보겠습니다. Environment Variables가 궁금하신 분들은 환경 변수에서 확인하실 수 있습니다.
PATH Environment Variables & 명령어
PATH Environment Variables를 살펴보기 전에 리눅스에서 명령어를 어떻게 인식하지는 보도록 하겠습니다. 아래와 같이 date
명령어를 실행해 보면 현재 날짜가 출력이 됩니다.
[root@server ~]# date
Sat Sep 30 16:42:38 KST 2023
which
는 명령어의 전체 경로를 출력해 주는 명령어입니다. 즉 which 명령어를 통하여 date 명령어를 조회해 보면 date 명령어의 실행 파일 위치를 확인할 수 있습니다.
[root@server ~]# which date
/usr/bin/date
[root@server ~]# ll /usr/bin/date
-rwxr-xr-x. 1 root root 108624 Apr 14 2020 /usr/bin/date
명령어는 단지 실행 가능한 파일이며 date
명령어는 /usr/bin 디렉터리 아래에 위치하고 있습니다. 그럼 우리가 명령어를 실행할 때 아래와 같이 /usr/bin/date라는 전체 경로를 입력해서 실행해야 하겠지만 실제로는 어느 위치에서 date를 사용하든 동일한 파일이 실행됩니다.
[root@server tmp]# cd /
[root@server /]# date
Sat Sep 30 16:46:19 KST 2023
[root@server /]# cd /tmp
[root@server tmp]# date
Sat Sep 30 16:46:21 KST 2023
[root@server ~]# /usr/bin/date
Sat Sep 30 16:46:25 KST 2023
이걸 가능하게 해주는 기능이 PATH Environment Variables 입니다. PATH Environment Variables는 명령어가 시스템 어느 위치에서든 실행 가능하도록 만들어 줍니다. 단지 실행 가능한 파일이 있는 디렉터리 위치를 PATH 환경 변수에 등록하여 주면 됩니다.
[root@server ~]# env | grep PATH
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bi
PATH Environment Variables를 출력해 살펴보면 콜론(”:”)으로 분리된 여러 디렉터리 경로들이 출력됩니다. 우리가 명령어를 사용할 때 PATH 변수에 가장 처음 나오는 /usr/local/sbin 디렉터리부터 순차적으로 검색됩니다. 사용자가 입력한 명령어와 파일 이름이 매칭되면 해당 파일을 실행합니다.
위에서 봤던 which 명령어 결과를 다시 살펴보겠습니다.
[root@server ~]# which date
/usr/bin/date
which
명령어는 PATH Environment Variables에 등록된 디렉터리 내에서 date라는 실행 가능한 파일이 있는지 검색하는 명령어로 볼 수 있습니다. date 명령어는 PATH에 등록된 디렉터리 중 콜론 기준으로 4번째에 있는 /usr/bin 디렉터리 아래서 검색됩니다.
만약 파일이 실행 가능하지 않다면 which
명령어는 date 파일이 있어도 정상적으로 찾지 못하는 걸 볼 수 있습니다.
[root@server ~]# chmod a-x /usr/bin/date
[root@server ~]# ll /usr/bin/date
-rw-r--r--. 1 root root 108624 Apr 14 2020 /usr/bin/date
[root@server ~]# which date
/usr/bin/which: no date in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin)
시스템 전역 명령어 설정
주로 명령어를 시스템 전역에서 사용할 수 있도록 하기 위해서 PATH 변수를 설정합니다. 설정 방법은 크게 2가지로 나눠볼 수 있습니다.
- 기존 변수는 그대로 두고 명령어를 PATH 환경 변수의 위치로 이동
- PATH Environment Variables에 새로운 디렉터리 추가
방법1 : 명령어를 PATH Environment Variables의 위치로 이동
첫 번째 방법인 PATH Environment Variables로 명령어를 이동시켜서 사용자가 만든 명령어를 시스템 어느 위치에서든 사용할 수 있도록 변경해 보겠습니다.
새로 만들 명령어는 /command/date 파일입니다. 해당 파일을 실행하면 “Hello Date World!”라는 문구가 실행됩니다. 아래 절차대로 파일을 만들고 실행 권한을 부여해서 명령어를 만들도록 하겠습니다.
[root@server ~]# vi date
#!/usr/bin/bash
echo "Hello Date World!"
[root@server ~]# chmod a+x date
-rwxr-xr-x. 1 root root 41 Sep 30 18:37 date
위 명령어를 실행시키면 다음과 같이 작동합니다.
[root@server ~]# ./date
Hello Date World!
그럼 이 명령어를 PATH Environment Variables의 가장 처음 위치인 /usr/local/sbin 디렉터리로 복사해 보도록 하겠습니다.
[root@server ~]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
[root@server ~]# cp date /usr/local/sbin/
명령어를 찾는 PATH Environment Variables의 디렉터리 내로 새로 만든 명령어를 이동시켰습니다. 기존 시스템에도 date라는 명령어가 있는데 어떻게 달라지는지 확인해 보겠습니다.
[root@server ~]# su -
[root@server ~]# date
Hello Date World!
시스템에 원래 있던 날짜를 출력해 주던 명령어 대신 복사한 /usr/local/sbin/date 파일이 실행됩니다. 그 이유는 명령어가 PATH Environment Variables에서 검색이 되는데 가장 처음 디렉터리부터 매칭될 때까지 검색되기 때문입니다. 따라서 동일한 이름을 가지는 명령어의 경우 명령어가 위치한 디렉터리 위치가 중요합니다.
date 명령어를 /root/bin 디렉터리 아래로 이동시키고 다시 실행하면 /usr/bin 이 먼저 검색되므로 시스템에 원래 있던 date 명령어가 실행됩니다.
[root@server ~]# mkdir /root/bin
[root@server ~]# mv /usr/local/sbin/date /root/bin/
[root@server ~]#
[root@server ~]# su -
[root@server ~]# date
2023. 09. 30. (토) 18:52:38 KST
방법2 : PATH Environment Variables에 새로운 디렉터리 추가
이번에는 디렉터리 자체를 PATH Environment Variables에 등록하여 명령어로 인식하는 방법을 보겠습니다.
새로 추가될 디렉터리와 명령어 생성
- 디렉터리 생성
[root@server ~]# mkdir /command [root@server ~]# cd /command/ [root@server command]#
- 명령어 생성hello라는 명령어를 생성합니다. 명령어를 실행하면 “Hello World!!” 문구가 출력됩니다.
[root@server command]# echo 'echo "Hello World!!"' > hello [root@server command]# chmod a+x hello [root@server command]# ./hello Hello World!!
완성된 명령어는 “/command/hello” 로 실행할 수 있지만 아직 PATH Environment Variables에 등록되지 않은 디렉터리라서 시스템 전역 명령어로는 사용할 수 없습니다.
[root@server command]# /command/hello Hello World!! [root@server command]# hello bash: hello: command not found...
PATH Environment Variables 설정
PATH Environment Variables에 /command 디렉터리를 등록하여 hello
명령어를 시스템 전역 명령어로 만들도록 하겠습니다.
- 현재 PATH Environment Variables 확인
[root@server command]# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
- PATH Environment Variables에 /command 디렉터리 추가
[root@server command]# export PATH=/command:$PATH
[root@server command]# echo $PATH
/command:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
[root@server command]# hello
Hello World!!
export 명령을 이용해서 PATH Environment Variables를 재 정의했습니다. “export PATH=/command:$PATH” 이 명령에서 보는 것처럼 /command 디렉터리를 등록한 뒤 :$PATH를 추가하여 기존 PATH 환경 변수를 유지하였습니다.
PATH Environment Variables 영구 설정
쉘에서 그냥 export 명령어를 사용하여 등록하면 사용자가 로그아웃하면 설정이 유지되지 않습니다. 영구적으로 사용자가 로그인할 때마다 새로운 PATH Environment Variables를 인식해 주기 위해서는 사용자 로그인할 때 실행되는 환경 파일에 등록해야 합니다. 대표적으로 시스템 전역 환경 변수를 설정할 때는 /etc/profile을 이용합니다.
- /etc/profile에 PATH Environment Variables 설정
[root@server command]# vi /etc/profile
...
export PATH=/command:$PATH
위와 같이 PATH Environment Variables 설정을 등록하고 새로운 사용자로 로그인하여 hello
명령어를 사용해 보면 잘 출력되는 걸 보실 수 있습니다.
[root@server ~]# su -
[root@server ~]# env | grep PATH
PATH=/command:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
[root@server ~]# hello
Hello World!!
전체 유저가 아닌 특정 사용자에서만 사용할 수 있는 명령을 제공해 주기 위해서는 /etc/profile 파일이 아닌 사용자 개별 로그인 환경설정 파일에 등록할 수 있습니다. 사용자 개별 로그인 환경설정 파일은 각 사용자의 홈 디렉터리 아래 있는 “.bash_profile” 파일에 등록할 수 있습니다.
시스템에서 종종 아래와 같은 설정을 보실 수 있습니다.
# vi /home/wasadmin/.bash_profile
...
export JAVA_HOME="/usr/local/jdk"
export PATH=$JAVA_HOME/bin:$PATH
사용자 계정의 bash_profile에 설정하면 wasadmin이라는 사용자만 /usr/local/jdk/bin 디렉터리 아래에 위치한 java 명령어를 시스템 전역 명령어로 사용할 수 있습니다. 또한 시스템 전체에 다른 java 버전이 설치되어 있더라도 wasadmin 유저가 java를 실행하면 /usr/local/jdk/bin/java 파일을 불러오게 됩니다.
마치며
리눅스에서 명령어는 실행 가능한 파일이며 시스템에서 명령어를 찾을 때 PATH Environment Variables에 등록된 디렉터리에서 찾는 것을 확인했습니다. PATH Environment Variables를 관리하고 설정하는 것은 리눅스 어드민 업무 중 기본적이면서도 중요한 역할 중 하나입니다. 실제로 PATH를 잘못 설정해서 기존 PATH Environment Variables를 없애서 시스템이 문제가 발생하는 사례도 간혹 발생합니다. 이럴 때 PATH Environment Variables에 대한 개념을 알고 있다면 쉽게 해결할 수 있을 것입니다.