$PATH
는 리눅스 시스템의 핵심적인 자동 조작기 중 하나로, 사용자 경험에 은밀하게 영향을 미치지만 그 중요성은 결코 간과할 수 없습니다. 여기서는 $PATH
가 정확히 어떤 역할을 하는지, 그리고 사용자가 필요에 따라 어떻게 조정할 수 있는지 자세히 알아보겠습니다.
리눅스에서 $PATH
란 무엇이며 어떻게 작동하는가?
터미널 창에 명령어를 입력하고 엔터 키를 누르면, 명령어가 실제로 실행되기 전에 일련의 복잡한 과정이 시작됩니다.
Bash는 대부분의 리눅스 배포판에서 기본 셸로 사용됩니다. 이 셸은 사용자가 입력한 명령어들을 해석하고, 파라미터, 파이프, 리디렉션 등 다양한 요소를 처리합니다. 그 다음, 해당 명령어에 대응하는 실행 가능한 바이너리 파일을 찾아 사용자가 제공한 파라미터와 함께 실행합니다.
셸이 실행 파일을 찾는 첫 번째 단계는 해당 명령어가 쉘 자체에 내장되어 있는지 확인하는 것입니다. 만약 명령어가 “쉘 내장 명령어”라면, 더 이상 검색할 필요가 없습니다.
쉘 내장 명령어는 쉘 자체에 필수적인 요소이기 때문에 가장 쉽게 찾을 수 있습니다. 마치 항상 휴대하는 도구와 같습니다.
그러나 외부 도구가 필요할 때는 작업 공간을 뒤져 찾아야 합니다. 이것이 바로 $PATH
환경 변수가 하는 일입니다. $PATH
는 쉘이 실행 파일을 찾기 위해 검색하는 디렉토리 목록과 그 순서를 정의합니다.
명령어가 쉘 내장 명령어인지, 별칭인지, 함수인지, 아니면 독립적인 바이너리 파일인지 확인하려면 type
명령어를 사용할 수 있습니다. 예를 들어, 다음과 같이 clear
와 cd
명령어를 확인해 봅시다.
type clear
type cd
위의 결과를 보면 clear
는 바이너리 파일이며, /usr/bin
디렉토리에서 처음 발견된 것을 알 수 있습니다. 컴퓨터에 여러 버전의 clear
가 설치되어 있을 수 있지만, 쉘은 이 디렉토리의 버전을 사용하려고 시도합니다.
반면 cd
는 쉘 내장 명령어입니다.
$PATH
내용 확인
현재 $PATH
에 설정된 디렉토리 목록을 확인하려면 echo
명령어를 사용하여 $PATH
변수에 저장된 값을 출력하면 됩니다.
echo $PATH
출력 결과는 콜론(:)으로 구분된 파일 시스템 위치 목록입니다. 쉘은 이 목록을 왼쪽에서 오른쪽으로 순서대로 검색하며, 각 디렉토리에서 명령에 해당하는 실행 파일을 찾으려고 시도합니다.
위의 결과를 통해 쉘이 어떤 디렉토리에서 어떤 순서로 실행 파일을 찾는지 알 수 있습니다.
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/sbin
/bin
/usr/games
/usr/local/games
/snap/bin
여기서 중요한 점은 쉘이 현재 작업 디렉토리부터 검색을 시작하지 않는다는 것입니다. $PATH
에 나열된 디렉토리만 검색합니다.
만약 현재 작업 디렉토리가 $PATH
에 없다면, 쉘은 해당 디렉토리를 검색하지 않습니다. 마찬가지로, $PATH
에 포함되지 않은 디렉토리에 명령어가 저장되어 있다면 쉘은 해당 명령어를 찾을 수 없습니다.
이를 확인하기 위해 rf
라는 간단한 프로그램을 만들었습니다. rf
는 실행될 때 터미널에서 실행된 디렉토리의 이름을 출력합니다. rf
의 첫 번째 버전은 /usr/local/bin
에 있고, 최신 버전은 /dave/work
디렉토리에 있습니다.
이제 which
명령어를 사용하여 쉘이 어떤 버전의 프로그램을 찾아서 사용하는지 확인해 보겠습니다.
which rf
쉘은 $PATH
에 있는 디렉토리에서 발견된 버전인 /usr/local/bin/rf
를 사용합니다.
이제 rf
를 실행해 보겠습니다.
rf
rf
버전 1.0이 실행되었으며, 예상대로 /usr/local/bin
디렉토리에 있는 버전이 실행되었습니다.
만약 다른 버전의 rf
를 실행하고 싶다면, 다음과 같이 명령줄에서 실행 파일의 정확한 경로를 지정해야 합니다.
./work/rf
이제 rf
버전 1.1이 실행됩니다. 만약 이 버전을 항상 사용하고 싶다면, /usr/local/bin
디렉토리에 복사하고 기존 버전을 덮어쓸 수 있습니다.
예를 들어, rf
의 새 버전을 개발 중이라고 가정해 봅시다. 개발 및 테스트 중에는 자주 실행해야 하지만, 아직 릴리스되지 않은 개발 빌드를 실제 환경에 복사하고 싶지 않을 수 있습니다.
또는 새 버전의 rf
를 다운로드했을 때, 공개적으로 사용하기 전에 검증 테스트를 수행하고 싶을 수도 있습니다.
이때 현재 작업 디렉토리를 $PATH
에 추가하면 쉘이 해당 디렉토리에서 새 버전을 찾도록 할 수 있습니다. 또한, 이 변경 사항은 사용자에게만 적용되므로 다른 사람들은 여전히 /usr/local/bin
에 있는 rf
버전을 사용하게 됩니다.
$PATH
에 디렉토리 추가하기
export
명령어를 사용하여 $PATH
에 디렉토리를 추가할 수 있습니다. 추가된 디렉토리는 쉘이 실행 파일을 검색하는 디렉토리 목록에 포함됩니다. 쉘은 일치하는 실행 파일을 찾으면 검색을 중단하므로, /usr/local/bin
보다 먼저 디렉토리를 검색하도록 해야 합니다.
다음 예에서는 디렉토리를 $PATH
의 시작 부분에 추가하여 검색 우선순위를 높입니다.
export PATH=/home/dave/work:$PATH
이 명령어는 $PATH
를 추가하려는 디렉토리(/home/dave/work
)와 기존 $PATH
값으로 설정합니다.
첫 번째 PATH
에는 달러 기호($)가 없습니다. 이것은 PATH
변수의 값을 설정하는 것입니다. 마지막 $PATH
에는 달러 기호가 있는데, 이것은 기존 PATH
변수에 저장된 값을 참조하기 때문입니다. 또한, 새 디렉토리와 $PATH
변수 이름 사이에 콜론(:)이 사용된 것을 주의해야 합니다.
이제 변경된 $PATH
를 확인해 보겠습니다.
echo $PATH
/home/dave/work
디렉토리가 $PATH
의 맨 앞에 추가되었습니다. 콜론(:)은 새로 추가된 디렉토리와 기존 경로를 분리하는 역할을 합니다.
이제 rf
명령어를 다시 실행하여 어떤 버전이 실행되는지 확인해 보겠습니다.
which rf
rf
를 실행하면 다음과 같습니다.
rf
이제 쉘은 /home/dave/work
디렉토리에서 버전 1.1을 찾아 실행합니다.
만약 디렉토리를 $PATH
의 끝에 추가하고 싶다면, 명령어를 다음과 같이 변경하면 됩니다.
export PATH=$PATH:/home/dave/work
변경 사항을 영구적으로 만들기
명언처럼 “성공은 좋지만, 덧없다”와 같이 $PATH
에 대한 변경 사항은 터미널 창을 닫는 순간 모두 사라집니다. 변경 사항을 영구적으로 유지하려면 export
명령어를 설정 파일에 추가해야 합니다.
.bashrc
파일에 export
명령어를 추가하면, 터미널 창을 열 때마다 $PATH
가 설정됩니다. SSH 세션
과 같이 로그인이 필요한 세션을 “대화형” 세션이라고 합니다.
과거에는 터미널 세션에 로그인할 때 경로를 설정하기 위해 .profile
파일에 export
명령어를 추가했습니다.
하지만 .bashrc
또는 .profile
파일에 export
명령어를 추가하면 대화형 및 로그인 터미널 세션 모두에서 $PATH
가 올바르게 설정된다는 것을 알 수 있습니다. 그러나 환경에 따라 다를 수 있으므로, 여기서는 모든 경우를 처리할 수 있도록 두 파일에서 모두 설정하는 방법을 보여드리겠습니다.
홈 디렉토리에서 다음 명령어를 사용하여 .bashrc
파일을 편집합니다.
gedit .bashrc
gedit
편집기가 열리고 .bashrc
파일이 로드됩니다.
파일의 맨 아래로 스크롤한 다음, 앞에서 사용한 export
명령어를 추가합니다.
export PATH=/home/dave/work:$PATH
파일을 저장합니다. 다음으로 터미널 창을 닫았다가 다시 열거나, dot
명령어를 사용하여 .bashrc
파일을 다시 읽습니다.
. .bashrc
그런 다음, 다음 echo
명령어를 입력하여 변경된 $PATH
를 확인합니다.
echo $PATH
결과를 보면, /home/dave/work
디렉토리가 $PATH
의 시작 부분에 추가된 것을 확인할 수 있습니다.
.profile
파일에 명령어를 추가하는 과정은 동일합니다. 다음 명령어를 입력합니다.
gedit .profile
gedit
편집기가 시작되고, .profile
파일이 로드됩니다.
파일 맨 아래에 export
명령어를 추가한 후 저장합니다. .profile
파일은 새 터미널 창을 열어도 자동으로 다시 로드되지 않습니다. 변경 사항을 적용하려면 로그아웃했다가 다시 로그인하거나, 다음 dot
명령어를 사용해야 합니다.
. .profile
모든 사용자를 위한 경로 설정하기
시스템을 사용하는 모든 사용자의 경로를 설정하려면, /etc/profile
파일을 수정할 수 있습니다.
다음과 같이 sudo
를 사용하여 편집해야 합니다.
sudo gedit /etc/profile
gedit
편집기가 시작되면 파일 맨 아래에 export
명령어를 추가합니다.
파일을 저장하고 닫습니다. 변경 사항은 다른 사용자가 다음에 로그인할 때 적용됩니다.
보안 관련 주의 사항
$PATH
를 설정할 때, 다음과 같이 실수로 콜론(:)을 먼저 추가하지 않도록 주의해야 합니다.
이렇게 하면 현재 디렉토리를 가장 먼저 검색하게 되어 보안 위험이 발생할 수 있습니다. 예를 들어, 다운로드한 압축 파일을 특정 디렉토리에 압축 해제했다고 가정해 봅시다. 그 디렉토리에서 다른 압축 파일을 발견하고, 해당 압축을 풀기 위해 unzip
을 실행합니다.
만약 첫 번째 압축 파일에 악성 실행 파일인 unzip
이 포함되어 있다면, 실제 unzip
실행 파일 대신 실수로 악성 실행 파일을 실행하게 됩니다. 이는 쉘이 현재 디렉토리를 먼저 찾기 때문에 발생합니다.
따라서 export
명령어를 입력할 때 항상 주의하고, echo $PATH
명령어를 사용하여 변경된 내용을 확인해야 합니다.