[Linux] PATH 환경 변수(Environment Variables) 설정
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
명령어는 실행 명령어의 전체 경로를 출력해 주는 도구입니다. 이를 통해 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/date
에 위치하지만, 사용자는 전체 경로를 입력하지 않고도 어느 디렉터리에서든 명령을 실행할 수 있습니다. 이는 시스템이 PATH 환경 변수를 통해 명령어를 검색하기 때문입니다.
[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 환경 변수에 실행 가능한 디렉터리가 등록되어 있기 때문입니다. 이를 확인해보면 다음과 같습니다.
[root@server ~]# env | grep PATH PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bi
PATH 변수는 콜론(:
)으로 구분된 여러 디렉터리 경로들을 나열하고 있으며, 시스템은 명령어 입력 시 왼쪽부터 오른쪽 방향으로 해당 이름의 실행 파일을 검색합니다.
PATH와 which 명령어의 연동
[root@server ~]# which date /usr/bin/date
위에서 본 which date
결과도 PATH 환경 변수의 검색 순서에 따라 /usr/bin/date
가 찾아진 것입니다. 이때 해당 파일이 실행 가능하지 않으면 which
명령어는 명령어가 있어도 찾지 못합니다.
[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 환경 변수와 관련된 설정이 필요합니다. 방법은 크게 두 가지가 있습니다
- 명령어를 PATH에 포함된 디렉터리로 이동하기
새로운 디렉터리를 PATH에 등록하기
방법1 : 명령어를 PATH 내 디렉터리로 이동
첫 번째 방법인 PATH로 명령어를 이동시켜서 사용자가 만든 명령어를 시스템 어느 위치에서든 사용할 수 있도록 변경해 보겠습니다.
새로 만들 명령어는 /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 ~]# ./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 환경 변수에/command
디렉터리가 등록되어 있지 않기 때문에 시스템 전역 명령어로는 인식되지 않습니다.[root@server command]# /command/hello Hello World!! [root@server command]# hello bash: hello: command not found...
이제 /command
디렉터리를 PATH 환경 변수에 추가하여 hello 명령어를 어디서든 사용할 수 있도록 설정해 보겠습니다.
[root@server command]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/.local/bin:/root/bin
[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를 설정하면 세션이 종료되면 설정이 사라지므로, 영구적으로 적용하기 위해서는 로그인 시 자동으로 실행되는 환경 설정 파일에 등록해야 합니다. 시스템 전역 설정은 /etc/profile
파일을 이용합니다.
[root@server command]# vi /etc/profile ... export PATH=/command:$PATH
이제 새로운 사용자로 로그인하면 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!!
사용자별로 적용하고 싶을 경우 각 사용자의 .bash_profile
파일에 설정하면 됩니다
# vi /home/wasadmin/.bash_profile ... export JAVA_HOME="/usr/local/jdk" export PATH=$JAVA_HOME/bin:$PATH
이렇게 설정하면 wasadmin
사용자만 해당 경로에 있는 java 명령어를 사용할 수 있습니다.
마치며
리눅스에서 명령어는 실행 가능한 파일이며, 시스템은 PATH 환경 변수에 등록된 디렉터리에서 해당 명령어를 순차적으로 검색하여 실행합니다. 이 과정을 통해 사용자는 복잡한 전체 경로를 입력하지 않고도 명령어를 간편하게 사용할 수 있습니다.
PATH 설정은 시스템 전반에 영향을 미치는 중요한 요소이며, 잘못 설정할 경우 시스템 명령어가 동작하지 않거나 예상치 못한 명령어가 실행될 수 있습니다. 따라서 환경 변수 설정 시에는 항상 현재 PATH를 백업하고, 변경 사항을 신중히 적용해야 합니다.
이 개념을 잘 이해하고 있다면 시스템에 새로운 유틸리티를 쉽게 배포하거나 사용자 환경을 깔끔하게 구성하는 데 큰 도움이 될 것입니다.
댓글
댓글 쓰기