리눅스/Debian or Ubuntu

리눅스(Linux) 환경 변수 $PATH 설정 방법

씨실과 날실 2019. 11. 24. 09:00


이 글은 작성 중입니다.


환경변수 $PATH를 설정하는 이유

환경변수 $PATH를 설정하는 이유는 간단히 요약하자면 명령 등이 속해 있는 디렉터리를 환경 변수 $PATH에 등록함으로써 사용하고자 하는 명령 등을 전체 경로를 적거나 혹은 해당 디렉터리에 들어가 실행하는 번거로움을 없애 작업 생산성을 높이기 위함입니다.

이에 관한 보다 자세한 내용은 아래 링크를 참고하시기 바랍니다.

지난 번에는 바로 위 링크의 게시물을 통해 윈도 10의 환경 변수 %Path% 설정 방법에 대해 알아보았습니다. 이번에는 리눅스의 환경 변수 $PATH 설정 방법에 대해 알아보도록 하겠습니다.




$PATH 테스트용 디렉터리 및 파일 생성

기존 디렉터리 및 파일 확인

가장 먼저 현재 위치에 어떤 디렉터리와 파일이 있는지 간략히 알아보도록 합시다.

study@study-VirtualBox:~$

리눅스를 부팅하여 터미널을 보면 위와 같은 모습을 볼 수 있습니다.

@ 왼쪽은 사용자명, @ 오른쪽은 컴퓨터명(서버명/호스트명)을 의미합니다. 그리고 :(쌍점) 오른쪽은 현재 사용자가 위치해 있는 디렉터리를 알려줍니다.

~(물결표)는 현재 로그인 중인 사용자의 홈 디렉터리를 의미합니다. 리눅스의 사용자 홈 디렉터리의 절대 경로는 다음과 같습니다.

/home/사용자 계정명


참고로, 만약 자신의 정확한 현재 위치를 확인하려면 pwd 명령을 실행해줍니다.

study@study-VirtualBox:~$ pwd
/home/study
study@study-VirtualBox:~$

그러면 위 그림처럼 현재 위치해 있는 절대 경로를 확인할 수 있습니다.


study@study-VirtualBox:~$ ls
examples.desktop  work  다운로드  바탕화면  사진  템플릿
study             공개  문서      비디오    음악
study@study-VirtualBox:~$

ls 명령을 입력합니다. 그러면 위 그림처럼 해당 디렉터리 안에 존재한 바로 아래 단계 하위 디렉터리와 파일들을 확인할 수 있습니다.

새로운 디렉터리 생성

study@study-VirtualBox:~$ mkdir works
study@study-VirtualBox:~$ ls
examples.desktop  work   공개      문서      비디오  음악
study             works  다운로드  바탕화면  사진    템플릿
study@study-VirtualBox:~$

mkdir(make directory) 명령어를 이용해 새로운 디렉터리를 만들어줍니다. 여기서는 works라는 이름의 디렉터리를 만들어주었습니다.

다시 ls 명령어를 확인하면 새 디렉터리가 생성된 것을 확인할 수 있습니다.


리눅스 기본 쉘 확인

현재 리눅스 시스템의 기본 쉘은 다음을 통해 확인할 수 있습니다.

study@study-VirtualBox:~$ echo $SHELL
/bin/bash
study@study-VirtualBox:~$

이번 쉘 스크립트 작성은 리눅스 주요 배포판들의 기본 쉘인 bash쉘을 이용하겠습니다.

Bash 쉘 스크립트 문서 생성

이제 $PATH 설정을 테스트할 쉘 스크립트 문서를 작성합니다. 작성할 문서는 특정 문구를 출력해주는 가장 기초적인 스크립트입니다.

gedit 같은 GUI 문서 편집기를 이용해 생성해도 되지만 이번에는 우분투 또는 리눅스 초심자들에게 터미널과 친숙하게 도와 드리고자 모든 작업을 터미널에서 하겠습니다.

study@study-VirtualBox:~$ cd ./works
study@study-VirtualBox:~/works$ cat > hello.sh
#!/bin/bash
printf "Welcome to https://wnw1005.tistory.com\n"
study@study-VirtualBox:~/works$ ls
hello.sh
study@study-VirtualBox:~/works$

먼저 cd 명령어로 새로 만든 디렉터리로 이동합니다.

cat > 파일명

위 명령어를 실행합니다. 그러면 다음 줄로 이동되면서 내용 입력 대기 상태로 들어갑니다. 이때 내용을 작성해주시면 됩니다.

참고로 확장자는 쉘 스크립트임을 의미하는 .sh로 설정해줍니다.

cat은 터미널에서 파일의 내용을 확인하거나, 간단한 문서를 생성할 때 사용하는 명령어입니다.

#!/bin/bash
printf "Welcome to https://wnw1005.tistory.com\n"

위 내용을 입력해주시면 됩니다. 해당 스크립트의 구문은 다음과 같은 의미를 가집니다.

#!/bin/bash

리눅스는 여러 쉘을 사용할 수 있습니다. 주요 리눅스 배포판들은 대부분 bash 쉘이 기본 쉘로 설정되어 있습니다.

문서 맨 앞줄의 #!/bin/bash은 해당 파일을 실행할 때 사용할 명령어 해석기가 bash 쉘임을 선언하는 구문입니다.

쉘 스크립트 및 프로그래밍 문서에서 #은 일반적으로 주석 기호를 뜻하지만 #!은 실행 가능 쉘 스크립트임을 알려주는 기호입니다.

#! 뒤에 붙은 문구는 명령어 해석기가 위치해 있는 절대 경로(반드시 전체 경로를 작성해야 합니다.)를 의미합니다. 즉 #!/bin/bash은 명령어 해석기로 사용될 bash 쉘이 /bin/bash에 있다는 의미입니다.

printf "출력할 문구"

printf는 문자열을 출력하는 명령어입니다.

\n

\n은 강제 개행(줄바꿈)을 하라는 의미입니다.

만약 이 \n 없이 printf 명령을 실행하면 다음과 같이 출력됩니다.

study@study-VirtualBox:~$ printf "Welcome to https://wnw1005.tistory.com"
Welcome to https://wnw1005.tistory.comstudy@study-VirtualBox:~$

\n을 붙이면 아래와 같이 출력됩니다.

study@study-VirtualBox:~$ printf "Welcome to https://wnw1005.tistory.com\n"
Welcome to https://wnw1005.tistory.com
study@study-VirtualBox:~$

강제 개행 기호 \n를 사용해 가독성을 높일 수 있습니다.


생성 쉘 스크립트 문서 퍼미션 설정

study@study-VirtualBox:~/works$ ./hello.sh
bash: ./hello.sh: 허가 거부
study@study-VirtualBox:~/works$ ls -al hello.sh
-rw-r--r-- 1 study study 62 11월 19 15:43 hello.sh
study@study-VirtualBox:~/works$ chmod 777 hello.sh
study@study-VirtualBox:~/works$ ls -al hello.sh
-rwxrwxrwx 1 study study 62 11월 19 15:43 hello.sh
study@study-VirtualBox:~/works$

위에서 만든 쉘 스크립트 문서를 실행해보면 허가 거부가 뜹니다. 해당 문서의 실행 권한이 없기 때문입니다.

일반적으로 파일을 생성하면 기본 퍼미션값이 'rw-r--r--(644)'입니다. 실행 권한이 없습니다.

실행 권한을 주려면 chmod 명령을 사용해 실행 권한을 부여해주어야 합니다.

퍼미션 상대 모드 설정

chmod a+x filename.sh

chmod : 퍼미션 변경 명령

a+x : 모든 사람(a)에게 실행 권한(x) 부여(+)

아니면 위 예시처럼 퍼미션을 숫자로 설정해줍니다.

퍼미션 절대 모드 설정

chmod 777 filename.sh

chmod : 퍼미션 변경 명령

777 : 파일 소유자(User), 파일 관리그룹(Group),  소유자나 그룹 멤버를 제외한 사람(Oters) 이 세 부류의 사람들에게 모두 읽기, 쓰기, 실행 권한을 모두 부여

퍼미션 상대 모드 설정은 기존의 퍼미션 정보를 알고 있다는 전제 하에 그 정보를 바탕으로 권한을 제거, 추가, 동일화하는 것이므로 번거롭습니다. 그래서 많은 수의 관리자들은 자신이 원하는 설정값을 바로 적용할 수 있는 퍼미션 절대 모드 설정을 이용합니다.

퍼미션 설정 후 ls -al 명령어를 사용해 퍼미션 설정이 제대로 되었는지 확인합니다.


생성 셸 스크립트 문서 실행

study@study-VirtualBox:~/works$ ./hello.sh
Welcome to https://wnw1005.tistory.com
study@study-VirtualBox:~/works$ sh hello.sh
Welcome to https://wnw1005.tistory.com
study@study-VirtualBox:~/works$

이제 작성한 쉘 스크립트 문서를 실행해봅시다. 실행 방법은 위 예시처럼 두 방법이 있습니다.

결과는 동일하지만 실행되는 과정은 다른데 그 차이는 아래와 같습니다.

sh filename.sh

sh로 쉘 스크립트를 실행하면 시스템의 환경설정에 설정되어 있는 기본 쉘을 통해 실행된다.

기본 쉘은 echo $SHELL을 실행하여 확인할 수 있습니다.

./filename.sh

./는 각 쉘 스크립트 파일의 맨 윗줄에 있는 사용 쉘 스크립트 선언 구문을 확인하여 그에 맞는 쉘을 사용하여 실행합니다.

위 예시에는 #! /usr/bin/env bash가 선언되어 있으므로 bash 쉘을 사용하여 실행하게 됩니다.

주요 리눅스 배포판의 기본 쉘은 bash이지만 쉘 스크립트 파일이 꼭 bash로만 작성되는 것은 아닙니다. bash 외에도 dash, csh 등 다양한 쉘이 있고 각 쉘마다 문법이 다르기때문에  ./로 실행하는 것이 좋습니다.




$PATH 설정값 확인

잘못된 $PATH 설정값 확인

study@study-VirtualBox:~$ echo $path

study@study-VirtualBox:~$

리눅스의 주요 환경변수는 $영어 대문자로 설정되어 있습니다. 리눅스는 대소문자를 구별하여 별개의 것으로 인식합니다. 따라서 위 예시처럼 소문자를 쓰면 등록된 경로값이 나오지 않습니다. 


로그인한 사용자의 $PATH 설정값 확인

study@study-VirtualBox:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
study@study-VirtualBox:~$

우분투의 경우, 따로 설정하지 않았다면 위 값이 기본값입니다.


root 사용자의 $PATH 설정값 확인

study@study-VirtualBox:~$ sudo su
[sudo] study의 암호:
root@study-VirtualBox:/home/study# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games
root@study-VirtualBox:/home/study#




새로운 $PATH 환경변수 임시 등록

study@study-VirtualBox:~$ export PATH=$PATH:/home/study/works
study@study-VirtualBox:~$


export PATH=/추가할 경로1:/추가할 경로2:/경로3:$PATH

일반적으로 환경변수 $PATH를 설정할 땐 위 구문을 사용하게 됩니다.

export

export는 설정하고자 하는 변수를 환경변수로 등록할 때 씁니다.

본래 이 export는 전문적으로 설명하자면 자식 프로세스에 변수를 전달하는 쉘 빌트인 명령어로, 부모 프로세스에 영향을 주는 source의 반대 개념 명령어입니다.

PATH=/추가할 경로1:/추가할 경로2:/경로3:$PATH

기존의 $PATH 값에 새로운 디렉터리를 추가할 때 위와 같은 방식을 사용합니다.

=(등호) 왼편에는 변수명(대문자), 오른편에는 변숫값을 적어줍니다. 이때 등호 양 옆에는 공백이 있으면 안 됩니다.

추가되는 디렉렉터리는 :(쌍점, 콜론)으로 구분합니다. 즉 ::(쌍점, 콜론)이 굽ㄴ자 역할을 하는 것이지요.

또한 기존의 $PATH값은 $PATH를 붙여줌으로써 유지해줍니다. 만약 이 $PATH가 붙지 않는다면 기존 $PATH값이 유지되지 않습니다.


환경변수 $PATH 확인

echo $PATH

터미널에 echo $PATH를 실행하면 현재 등록되어 있는 환경 변수 $PATH값을 확인할 수 있습니다.

study@study-VirtualBox:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin:/home/study/works
study@study-VirtualBox:~$

확인해보시면 위 예시처럼 아까 추가한 디렉터리가 기존의 디렉터리와 함께 $PATH에 등록된 것을 확인할 수 있습니다.


환경 변수 $PATH 설정 후 쉘 스크립트 파일 실행

다른 디렉터리에서 실행

study@study-VirtualBox:~$ cd /
study@study-VirtualBox:/$ hello.sh
Welcome to https://wnw1005.tistory.com
study@study-VirtualBox:/$

$PATH를 새로 설정한 터미널에서, 아까 테스트용으로 작성한 쉘 스크립트 파일(hello.sh)을 파일이 위치한 디렉터리가 아닌 다른 디렉터리에서 실행해봅시다.

cd 명령어를 이용해 다른 디렉터리로 이동합니다. 참고로 예시에 쓰인 'cd /'는 리눅스(유닉스 계열) 시스템의 최상위 디렉터리로 이동한 다는 뜻입니다.

보시면 작성한 쉘 스크립트 파일이 정상적으로 실행됨을 확인할 수 있습니다.


새 터미널에서 실행

study@study-VirtualBox:~$ hello.sh
hello.sh: 명령을 찾을 수 없습니다
study@study-VirtualBox:~$

그러나 $PATH를 새로 설정한 터미널이 아니라 새로 터미널을 열어 해당 쉘 스크립트 파일을 실행하면 위처럼 오류를 출력하며 실행이 되지 않음을 알 수 있습니다.


study@study-VirtualBox:~$ echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/snap/bin
study@study-VirtualBox:~$

새로 연 터미널에서 $PATH 값을 확인해보면 아까 환경변수 $PATH에 추가했던 디렉터리가 없어진 것을 볼 수 있습니다.

왜 이런 현상이 일어나는지 알기 위해서는 앞의 export 설명을 상기할 필요가 있습니다.

환경변수로 등록할 때 사용한 export는 실행되는 해당 프로세스(= 부모 프로세스)와 그 자식 프로세스에만 영향을 끼치는 것입니다.(자식 프로세스에 영향을 미치는 것을 변수 상속이라고 합니다.)

새로 연 터미널은 위 두 프로세스와는 독립된 별개의 프로세스이므로 export로 적용한 환경변수가 새 터미널에는 적용되지 않는 것입니다.




터미널 환경 변수 복제

현재 (기존) 터미널에 적용한 환경 변수를 새로 여는 터미널에도 그대로 적용하고 싶다면(환경 복제) 다음과 같은 절차를 거쳐야 합니다.

기존 터미널

study@study-VirtualBox:~$ set >~/environment.tmp
study@study-VirtualBox:~$

먼저 현재 (기존) 터미널의 환경을 위와 같은 명령을 통해 환경 내요ㅗㅇ을 파일로 저장해줍니다.


새 터미널

study@study-VirtualBox:~$ . ~/environment.tmp
bash: BASHOPTS: 읽기전용 변수
bash: BASH_VERSINFO: 읽기전용 변수
bash: EUID: 읽기전용 변수
bash: PPID: 읽기전용 변수
bash: SHELLOPTS: 읽기전용 변수
bash: UID: 읽기전용 변수
study@study-VirtualBox:~$

이제 새 터미널을 열어 아까 생성한 환경 내용 파일을 실행해줍니다. 그러면 위와 같은 내용이 출력되면서 환경 변수 내용들이 적용됩니다.

이제 아무 디렉터리에서 다시금 아까 작성한 쉘 스크립트 파일을 실행해줍니다.

study@study-VirtualBox:~$ hello.sh
Welcome to https://wnw1005.tistory.com
study@study-VirtualBox:~$

위처럼 정상적으로 실행되는 것을 확인할 수 있습니다.


복제한 임시 환경 변수 설정 삭제

study@study-VirtualBox:~$ rm ~/environment.tmp
study@study-VirtualBox:~$

생성한 환경 변수 저장 파일은 위와 같은 명령어로 삭제할 수 있습니다. 물론 이미 실행 중인 터미널에 적용된 환경 변수는 바로 초기화되지 않습니다.




$PATH 설정 영구 등록

앞서 알아본 환경 변수 등록 방법은 어디까지나 임시로만 적용되는 것이며 해당 터미널이나 쉘 등이 종료되면 해당 내용은 초기화됩니다.

해당 환경 변수 내용을 영구적으로 등록하여 언제나 사용하고 싶다면 사용자자별 환경 설정 파일이나 시스템 환경설정 파일에 추가해주어야 합니다.


export PATH=/추가할 경로1:/추가할 경로2:/경로3:$PATH

gedit 같은 문서 편집 프로그램을 열어 환경 설정 파일 말미에 위 구문을 작성하고 저장해주시면됩니다. 그러나 이것은 터미널 작업에 익숙지 않은 분들에게 권장드리는 방법이고 터미널 작업에 익숙한 터미널에서 바로 내용을 추가하고 적용할 수 있습니다.


환경 설정 파일 백업

study@study-VirtualBox:~$ cp ~/.bashrc ~/.bashrc.bak
study@study-VirtualBox:~$


특정 사용자에게 등록

study@study-VirtualBox:~$ echo 'export PATH=$PATH:/home/study/works' >> ~/.bashrc
study@study-VirtualBox:~$


수정한 환경설정 파일 바로 적용

study@study-VirtualBox:~$ source ~/.bashrc
study@study-VirtualBox:~$