리눅스 환경 변수 완벽 가이드
리눅스 시스템은 다양한 종류의 환경 변수를 활용합니다. 이 글에서는 이러한 변수들을 확인하고, 로컬 및 원격 로그인 시 환경 변수를 설정하는 방법, 그리고 시스템 재부팅 후에도 설정이 유지되도록 하는 방법을 자세히 살펴보겠습니다.
환경 변수의 작동 원리
터미널 창을 열면, 쉘(shell)이라는 명령 해석기가 실행됩니다. 이 쉘은 환경 변수들의 집합을 참조하여 자신의 동작을 구성합니다. 환경 변수는 터미널 창과 쉘이 필요한 모든 정보를 제공합니다. 이러한 변수들은 함께 작동하여 명령 프롬프트의 모양부터 전체적인 환경 설정을 정의하므로 ‘환경 변수’라고 불립니다.
환경 변수에는 시스템 전체에 적용되는 전역 변수와 특정 세션에만 유효한 변수가 있습니다. 세션 변수는 해당 세션을 사용하는 사용자에게만 보이며, 다른 사용자는 접근할 수 없습니다. 또한, 쉘 내에서 정의되는 세 번째 유형의 환경 변수도 있습니다. 로케일, 시간대, 키보드 설정, 명령을 찾을 때 검색되는 디렉터리 목록, 그리고 기본 편집기 등이 쉘 환경 변수에 저장됩니다.
이 글에서는 시스템에 존재하는 환경 변수를 확인하는 방법, 사용자 고유의 환경 변수를 생성하는 방법, 자식 프로세스에서 사용할 수 있도록 설정하는 방법, 그리고 시스템 재부팅 후에도 설정이 유지되도록 하는 방법 등을 자세히 알아보겠습니다.
환경과 상속
쉘이 시작되면 초기화 과정을 거치며, 이 과정에서 환경을 정의하는 환경 변수들이 읽혀집니다. 이 쉘에서 다른 프로그램이나 명령이 실행되면 (이를 자식 프로세스라고 함), 해당 프로세스는 부모 프로세스(즉, 현재 쉘)의 환경 설정을 상속받습니다. 하지만 환경에 추가되지 않은 변수는 자식 프로세스에 상속되지 않으므로 주의해야 합니다.
만약 자식 프로세스가 또 다른 쉘이라면, 해당 쉘은 새로운 환경 변수 집합으로 초기화됩니다. 따라서 현재 쉘에서 명령 프롬프트를 변경한 후 자식 쉘을 실행하면, 자식 쉘은 부모 쉘의 수정된 프롬프트를 상속받지 않습니다.
전역 환경 변수
일반적으로 환경 변수 이름은 대문자로 작성됩니다. 다음은 몇 가지 일반적인 전역 환경 변수와 그 값에 대한 설명입니다.
- SHELL: 터미널 창을 열 때 실행되는 쉘의 이름입니다. 대부분의 리눅스 배포판에서는 bash가 기본값입니다.
- TERM: 터미널 창은 하드웨어 터미널의 에뮬레이션입니다. 이 변수는 에뮬레이션될 하드웨어 터미널의 유형을 나타냅니다.
- USER: 현재 시스템을 사용하고 있는 사용자의 사용자 이름입니다.
- PWD: 현재 작업 디렉터리의 경로입니다.
- OLDPWD: 현재 작업 디렉터리로 이동하기 전에 있었던 디렉터리입니다.
- LS_COLORS: ls 명령에서 파일 형식을 강조 표시하는 데 사용되는 색상 코드 목록입니다. ls
- MAIL: 리눅스 컴퓨터에 메일 시스템이 설정되어 있는 경우 (기본적으로 설정되어 있지는 않음), 현재 사용자의 사서함 경로입니다. 현재 사용자의 사서함 경로.
- PATH: 쉘이 명령 실행 파일을 찾기 위해 검색하는 디렉터리 목록입니다.
- LANG: 언어, 현지화 및 문자 인코딩 설정입니다.
- HOME: 현재 사용자의 홈 디렉터리입니다.
- _: 밑줄(_) 환경 변수는 가장 최근에 입력한 명령을 저장합니다.
일부 변수는 단순히 값을 표시하는 것보다 더 복잡하게 사용될 수 있습니다. 환경 변수의 값을 확인하려면, 변수 이름 앞에 달러 기호($)를 붙여야 합니다.
터미널에서 환경 변수 이름을 입력할 때 탭 자동 완성 기능을 사용할 수 있습니다. 변수 이름의 일부 글자를 입력한 후 Tab 키를 누르면 쉘이 자동으로 이름을 완성합니다. 만약 여러 개의 환경 변수가 동일한 문자로 시작하면, 몇 글자를 더 입력하여 구분해야 합니다.
echo $SHELL
echo $LANG
echo $HOME
echo $PWD

새로운 전역 환경 변수를 생성하려면 `/etc/environment` 파일을 수정해야 합니다. 이 파일은 `sudo` 권한이 있어야 편집할 수 있습니다.
sudo gedit /etc/environment

환경 변수를 추가하려면 변수 이름, 등호(=), 그리고 저장할 값을 차례로 입력합니다. 등호의 앞뒤에는 공백을 두지 않아야 합니다. 환경 변수 이름은 문자, 밑줄(_), 숫자 등으로 구성될 수 있지만, 이름의 첫 글자는 숫자가 될 수 없습니다.
값에 공백이 포함된 경우에는 전체 값을 따옴표(“)로 묶어야 합니다.

파일을 저장한 후, 로그아웃하고 다시 로그인합니다. 그런 다음 `echo` 명령어를 사용하여 새로운 변수가 정상적으로 설정되었는지 확인합니다.
echo $WEBSITE

전역 환경 변수는 모든 사용자가 사용할 수 있으므로, 다른 사용자인 ‘mary’도 다음 로그인 시 환경 변수를 참조할 수 있습니다.
echo $WEBSITE

시스템의 모든 환경 변수를 한 번에 확인하려면 `printenv` 명령어를 입력합니다. 출력 결과가 많으므로 `sort`를 사용하여 정렬하고 `less`로 페이징하여 보는 것이 좋습니다.
printenv | sort | less

환경 변수들이 정렬된 상태로 `less`에 표시됩니다.

특정 주제와 관련된 환경 변수를 찾으려면 `grep` 명령을 사용하여 출력을 필터링할 수 있습니다. 특정 주제와 관련된.
printenv | grep GNOME

쉘 환경 변수
쉘 환경 변수는 bash의 동작과 기능을 설정하거나 기록하는 데 사용됩니다. 터미널을 사용하면 일부 값이 자동으로 업데이트됩니다. 예를 들어, `COLUMNS` 환경 변수는 터미널 창 너비가 변경되면 그에 맞게 업데이트됩니다.
- BASHOPTS: bash가 시작될 때 사용된 명령줄 옵션입니다.
- BASH_VERSION: bash 버전 번호를 문자열로 나타냅니다.
- BASH_VERSINFO: bash 버전을 숫자로 나타냅니다.
- COLUMNS: 현재 터미널 창의 너비입니다.
- DIRSTACK: pushd 명령으로 디렉토리 스택에 추가된 목록입니다.
- HISTFILESIZE: 히스토리 파일에 허용되는 최대 줄 수입니다. 허용되는 라인
- HISTSIZE: 메모리에서 허용되는 히스토리 라인 수입니다.
- HOSTNAME: 컴퓨터의 호스트 이름입니다.
- IFS: 내부 필드 구분 기호로서, 명령줄에서 입력을 분리하는 데 사용됩니다. 기본적으로 공백입니다.
- PS1: 기본 명령 프롬프트를 정의합니다. 이 변수에는 이스케이프 시퀀스라는 토큰이 포함될 수 있으며, 호스트 및 사용자 이름, 현재 작업 디렉터리, 시간 등을 표시합니다.
- PS2: 명령어가 여러 줄로 이어지고 추가 입력이 필요한 경우 표시되는 보조 프롬프트입니다. 기본적으로 ‘>’ 기호입니다.
- SHELLOPTS: `set` 옵션을 사용하여 설정할 수 있는 쉘 옵션입니다.
- UID: 현재 사용자의 사용자 식별자입니다.
다음은 몇 가지 쉘 변수를 확인하는 예시입니다.
echo $BASH_VERSION
echo $HOSTNAME
echo $COLUMNS
echo $HISTFILESIZE
echo $UID

참고로, 명령 프롬프트 정의에 사용할 수 있는 토큰들은 다음과 같습니다.
- t: HH:MM:SS 형식의 현재 시간
- d: 요일, 월, 날짜 형식의 현재 날짜
- n: 개행 문자
- s: 쉘의 이름
- W: 현재 작업 디렉터리의 이름
- w: 현재 작업 디렉터리의 경로
- u: 로그인한 사용자의 사용자 이름
- h: 컴퓨터의 호스트 이름
- #: 쉘 내의 각 명령에 할당된 번호입니다. 명령 프롬프트에서 명령 번호를 표시할 수 있습니다. (이는 명령 히스토리의 번호와는 다릅니다.)
- $: 일반 사용자는 달러 기호($)로, 루트 사용자는 해시 기호(#)로 프롬프트의 마지막 문자를 설정합니다. 사용자의 UID를 확인하여 결정됩니다. UID가 0이면 루트 사용자입니다.
`PS1` 환경 변수의 정의는 `.bashrc` 파일에서 찾을 수 있습니다.
세션 환경 변수 생성
자신만의 환경 변수를 만들려면, `.bashrc` 파일의 맨 아래에 추가하면 됩니다. SSH 연결과 같은 원격 세션에서 환경 변수를 사용하려면, `.bash_profile` 파일에도 추가해야 합니다.
두 파일에서 환경 변수를 정의하는 형식은 동일합니다. `.bash_profile` 파일에 정의를 추가하려면 홈 디렉터리에서 다음 명령어를 입력합니다.
gedit .bashrc

예를 들어, `INHERITED_VAR`이라는 환경 변수를 추가하고 “export” 키워드를 사용하여 자식 프로세스에 상속되도록 설정합니다.

파일 편집을 마친 후, 파일을 저장하고 닫습니다. 로그아웃했다가 다시 로그인하거나, `.` 명령어를 사용하여 쉘이 `.bash_profile` 파일을 다시 읽도록 할 수 있습니다.
. .bashrc

이제 명령줄에서 새로운 환경 변수를 생성해 보겠습니다.
LOCAL_VAR="This session only"

`echo` 명령어를 사용하면 두 환경 변수에 모두 접근할 수 있습니다.
echo $LOCAL_VAR
echo $INHERITED_VAR

`INHERITED_VAR` 환경 변수는 정의 시점에 “export” 키워드를 사용했기 때문에, 현재 쉘의 자식 프로세스에 상속됩니다. `bash` 명령어를 사용하여 자식 쉘을 실행하면 자식 쉘 내에서 두 변수를 다시 확인할 수 있습니다.
bash
echo $LOCAL_VAR
echo $INHERITED_VAR

`INHERITED_VAR`은 자식 쉘에서 접근할 수 있지만, `LOCAL_VAR`은 접근할 수 없습니다. `LOCAL_VAR`에 대해서는 빈 줄이 출력되는 것을 볼 수 있습니다.
“export” 키워드는 환경 변수를 자식 프로세스가 상속하는 환경에 추가하지만, `INHERITED_VAR`은 전역 환경 변수가 아닙니다. 따라서 다른 사용자(예: mary)는 이 변수를 참조할 수 없습니다.
echo $INHERITED_VAR

자식 bash 세션을 종료하려면 `exit` 명령어를 사용합니다.
exit
상속된 환경은 스크립트에도 영향을 미칩니다. 다음은 세 가지 환경 변수의 값을 터미널 창에 출력하는 간단한 스크립트입니다.
#!/bin/bash echo "WEBSITE" $WEBSITE echo "LOCAL_VAR" $LOCAL_VAR echo "INHERITED_VAR" $INHERITED_VAR
이 스크립트는 `envtest.sh`라는 파일에 저장되었고, 실행 권한을 다음과 같이 부여했습니다.
chmod +x envtest.sh
스크립트를 실행하면 세 가지 환경 변수 중 두 개에 접근할 수 있습니다.
./envtest.sh

스크립트는 전역 환경 변수인 `WEBSITE`과 `INHERITED_VAR`로 내보낸 환경 변수를 읽을 수 있습니다. 스크립트가 변수가 생성된 동일한 쉘에서 실행 중이라도 `LOCAL_VAR`에는 접근할 수 없습니다.
필요한 경우 명령줄에서 환경 변수를 내보낼 수 있습니다. `LOCAL_VAR`에 대해 이를 수행한 다음 스크립트를 다시 실행해 보겠습니다.
export LOCAL_VAR
./envtest.sh

이제 환경 변수가 현재 쉘의 환경에 추가되었으므로, 스크립트가 상속한 환경에도 나타납니다. 스크립트에서 해당 환경 변수를 참조할 수 있게 됩니다.
원격 연결
전역 환경 변수는 원격 로그인 세션에서도 접근할 수 있지만, 로컬에서 정의된 환경 변수를 원격으로 사용하려면 `.bash_profile` 파일에 추가해야 합니다. `.bashrc` 및 `.bash_profile` 파일에서 동일한 환경 변수를 다른 값으로 설정할 수 있습니다. 이는 예를 들어 시스템을 로컬 또는 원격으로 사용하는 사용자에 따라 동작을 변경하기 위해 스크립트에서 활용할 수 있습니다.
(혼란을 피하기 위해 `.profile` 파일도 존재하지만, `.bash_profile` 파일이 존재하면 `.profile` 파일은 읽히지 않습니다. 따라서 bash와 호환되는 가장 안전한 방법은 `.bash_profile` 파일을 사용하는 것입니다.)
`.bash_profile` 파일을 편집하려면 `gedit`을 다시 사용합니다.
gedit .bash_profile

이전에 사용했던 것과 동일한 값으로 동일한 환경 변수를 추가해 보겠습니다.

변경 사항을 저장하고 gedit를 닫습니다.
이제 다른 컴퓨터에서 SSH를 사용하여 테스트 컴퓨터에 연결하겠습니다.
ssh [email protected]

연결되면 스크립트를 다시 한 번 실행합니다.
./envtest.sh

`.bash_profile` 파일은 원격 로그인 초기화 과정에서 읽혀졌으며, `INHERITED_VAR` 환경 변수는 원격에서도 스크립트에서 접근 가능하게 되었습니다.
환경 변수 설정 해제
환경 변수를 설정 해제하려면 `unset` 명령을 사용합니다. 전역 환경 변수 `WEBSITE`과 내보낸 환경 변수 `INHERITED_VAR`의 설정을 해제하면, 명령줄이나 자식 프로세스에서 더 이상 사용할 수 없습니다.
unset WEBSITE
unset INHERITED_VAR
./envtest.sh
echo $WEBSITE

여기서 주의할 점은, 이 조치는 해당 세션에서 전역 환경 변수의 가용성만 변경한다는 것입니다. 동시에 로그인한 다른 사용자는 여전히 해당 전역 환경 변수에 접근할 수 있습니다. 다른 사용자의 변수는 로그인 프로세스에서 초기화되고 `/etc/environment` 파일에서 읽었으며, 각 사용자의 변수 복사본은 서로 독립적입니다.
예를 들어, 사용자 ‘dave’가 자신의 세션에서 설정을 해제하더라도 사용자 ‘mary’는 여전히 `WEBSITE` 환경 변수에 접근하고 그 값을 읽을 수 있습니다.
echo $WEBSITE

환경 관리
환경 변수는 스크립트와 응용 프로그램의 작동 방식을 제어하는 데 중요한 역할을 합니다. 설정이나 소량의 데이터를 저장하는 데 사용할 수 있으며, 예를 들어 스크립트는 다른 스크립트에서 참조할 수 있는 값으로 환경을 채울 수 있습니다. 파일에 쓰지 않고도 필요한 정보를 공유하는 데 유용합니다.