기술 커뮤니티의 대다수는 명령줄 인터페이스(CMD)나 셸을 통해 시스템과 상호작용하는 것을 즐깁니다. 일반적으로 이는 작업을 더 쉽게 만들어 줍니다. 예를 들어, GUI의 여러 버튼을 클릭해야 하는 것과 달리 여러 작업을 자동으로 실행할 수 있는 셸 명령을 만들 수 있습니다.
셸이나 CMD 프로그램을 실행하면 여러 정보가 컴파일됩니다. 이 정보는 프로그램이 기본 시스템 리소스에 액세스하는 방식과 전반적인 동작을 설정합니다. 이 정보는 환경이라고 불리는 곳에 저장할 수 있습니다. 환경은 키-값 쌍을 나타내는 문자열로 구성됩니다. 이 튜토리얼에서는 Ubuntu 20.04 VPS를 예로 들어 환경 변수 또는 셸 변수를 설정하는 방법을 안내합니다. 이 가이드는 다른 Linux 배포판에도 적용될 수 있습니다.
환경 변수와 셸 변수의 차이점은 무엇인가요?
세션을 시작하면 시스템’의 설정 및 구성 파일에서 정보가 수집됩니다. 그런 다음 이 정보는 셸 프로세스와 그 하위 프로세스에서 사용할 수 있게 됩니다. 이 정보는 다음과 같은 형식의 키-값 쌍 세트입니다:
|
1 2 3 |
KEY=value KEY="Some value" KEY=data1:data2 |
변수의 이름, 즉 키는 대소문자를 구분합니다. 하지만 관례적으로 대문자로 작성하는 것이 통용됩니다. 이는 다른 컨텍스트 내에서 변수를 쉽게 구분할 수 있도록 도와줍니다. 콜론 ‘:’ 문자를 사용하면 동일한 변수에 여러 값을 할당할 수 있습니다. 또한 = 주변에 공백을 남겨두지 않는 것이 중요합니다. 키는 변수이며 환경 변수와 셸 변수의 두 가지로 분류됩니다. 환경 변수는 시스템 전체에 정의되어 모든 하위 셸이나 프로세스에서 사용할 수 있는 모든 변수를 포함합니다. 이 변수들은 셸 명령을 통해 시작하는 프로세스에 정보를 전달하는 데 도움이 됩니다. 셸 변수에는 특정 셸 세션에 정의된 변수만 포함됩니다. 또한 해당 셸 인스턴스 내에서만 독점적으로 사용할 수 있는 변수만 포함됩니다.
환경 변수 및 셸 변수 목록 표시하기
기본적으로 터미널은 환경 변수와 셸 변수를 나열하는 두 가지 명령인 env 또는 printenv를 제공합니다. 이 명령들은 기본 상태에서 동일한 정보를 보여줍니다. 다음은 이러한 명령의 샘플 출력입니다:
env 사용 시:

printenv 사용 시:

보시다시피 출력 결과는 동일합니다. 차이점은 특정 키의 값을 원할 때 발생합니다. 이때 변수 이름과 함께 printenv를 사용합니다:

여러 값을 보려면 printenv 명령에 둘 이상의 인수를 전달할 수 있습니다. 값은 인수를 입력한 순서대로 나타납니다:

변수 이름을 지정하여 echo 명령을 사용해 변수 값을 표시할 수도 있습니다:

env 명령을 사용하면 다음과 같은 구문으로 변수 정의를 전달하여 프로그램이 실행되는 환경을 수정할 수 있습니다:
|
1 |
env VAR1="var 1 value" command_to_run command_options |
이를 통해 하위 프로세스에서 사용할 수 있는 값을 재정의하거나 새 값을 설정할 수 있습니다. printenv 및 env 명령은 위에서 본 것처럼 환경 변수를 나열합니다. 이 변수들은 이미 시스템 프로세스에 대해 정의되어 있었습니다. 셸 변수 목록을 보려면 set 명령을 사용할 수 있습니다. 변수 없이 set을 입력하면 모든 환경 변수, 셸 변수, 로컬 변수 및 셸 함수의 목록이 반환됩니다:

변수가 너무 많을 수 있습니다. 필요한 경우 다음 명령을 사용하여 페이지를 나누어 볼 수 있습니다:
|
1 |
set | less |
set 명령이 POSIX에서 실행되도록 지정하여 셸 함수를 출력하지 않음으로써 출력을 더 깔끔하게 정리할 수 있습니다. 여기서는 명령이 현재 환경을 변경하지 않도록 하위 셸(명령 프로세서의 별도 인스턴스)에서 실행합니다:
|
1 |
(set -o posix; set) |
위의 목록은 시스템에서 사용할 수 있는 모든 환경 및 셸 명령을 나열합니다. 다음 명령을 사용하여 출력을 줄여 셸 변수만 가져오도록 시도할 수 있습니다:
|
1 |
comm -23 <(set -o posix; set | sort) <(env | sort) |
위 명령의 샘플 출력은 다음과 같습니다:

이 명령에는 몇 가지 환경 변수가 포함될 수 있지만, 쉘 변수와 환경 변수를 구분하는 데 도움이 됩니다. 이는 set 명령은 변수 값을 따옴표로 묶는 반면, printenv 및 env 명령은 값을 따옴표로 묶지 않기 때문입니다. 쉘 변수는 파일에 변경 사항을 영구적으로 기록하지 않으면서 세션에 대해 지속적인 값을 설정하는 데 유용합니다.
공통 환경 변수
USER – 현재 로그인한 사용자입니다.
SHELL – 입력한 명령을 해석할 쉘입니다. 기본값은 bash이지만 변경할 수 있습니다.
HOME – 현재 사용자의 홈 디렉터리입니다.
TERM – 에뮬레이트할 터미널 유형을 지정합니다. 현재 에뮬레이트된 터미널을 보여줍니다.
PWD – 현재 작업 디렉터리입니다.
OLDPWD – 이전 작업 디렉터리입니다. 이는 디렉터리 변경 명령을 cd로 입력할 때 쉘이 이전 디렉터리로 전환하는 데 도움이 됩니다.
EDITOR – 터미널에 edit를 입력할 때의 기본 파일 편집기입니다.
LS_COLORS – ls 명령을 입력할 때 색상 출력을 추가하는 데 사용되는 색상 코드를 정의합니다. 파일 유형을 구분하고 사용자에게 정보를 제공하는 데 도움이 됩니다.
LOGNAME – 현재 사용자의 이름입니다.
MAIL – 현재 사용자의 사서함 경로를 정의합니다.
LANG – 현재 로캘 설정을 정의합니다.
PATH – 명령을 실행할 때 검색할 디렉터리 목록을 지정합니다. 명령을 실행하는 동안 시스템은 이 디렉터리들을 검색하고 처음 발견된 실행 파일을 사용합니다.
_ – 마지막으로 실행된 명령입니다.
공통 쉘 변수:
BASH_VERSION – 사람이 읽을 수 있는 형식의 bash 버전입니다.
BASH_VERSINFO – 기계가 읽을 수 있는 형식의 bash 버전입니다.
BASHOPTS – bash가 실행될 때 사용된 옵션 목록입니다. 쉘 환경이 예상대로 작동할지 여부를 결정하는 데 유용합니다.
COLUMNS – 화면에 출력을 그리는 데 사용되는 가로 열 수입니다.
DIRSTACK – pushd 및 popd 명령으로 사용할 수 있는 디렉터리 스택입니다.
HOSTNAME – 현재 컴퓨터의 호스트 이름입니다.
HISTFILESIZE – 파일에 저장되는 명령 기록의 줄 수입니다.
HISTSIZE – 메모리에 허용되는 명령 기록의 줄 수입니다.
IFS – 명령줄에서 입력을 구분하기 위한 내부 필드 구분 기호입니다. 기본값은 공백입니다.
SHELLOPTS-쉘 옵션을 설정하는 데 사용됩니다.
UID-현재 사용자의 UID입니다.
PS1– 기본 명령 프롬프트 정의입니다. 이는 쉘 세션을 시작할 때 프롬프트가 어떻게 보일지 정의하는 데 사용됩니다.
PS2 – 명령이 여러 줄에 걸쳐 있을 때의 보조 프롬프트를 선언합니다.
환경 및 쉘 명령 설정
먼저, 앞서 설명한 대로 변수 이름은 모두 대문자로 유지합니다. 다음으로, 쉘 변수를 생성하는 과정을 살펴보겠습니다. 마지막으로, 환경 변수를 생성해 보겠습니다.
쉘 변수 생성
일반적인 hello world로 시작해 보겠습니다. 터미널에 다음을 입력하세요:
|
1 |
MY_FIRST_VAR=’Hello World!’ |
변수에 공백이 있기 때문에 따옴표를 사용합니다. 느낌표는 특수 문자이므로 이스케이프 처리하거나 작은따옴표로 묶어야 하기 때문에 작은따옴표를 사용했다는 점에 유의하세요. 이제 첫 번째 쉘 변수를 생성했습니다. 이 변수는 현재 쉘 세션에서만 사용할 수 있습니다. 쉘 변수는 하위 쉘 및 프로세스에서는 사용할 수 없습니다. grep과 함께 set 명령을 사용하여 터미널에 출력할 수 있습니다:

또는 $ 기호와 변수 이름을 사용하여 참조하여 echo로 값을 표시할 수 있습니다:

printenv를 사용하여 출력을 시도하면 아무런 출력도 표시되지 않습니다. 이를 통해 이것이 환경 변수가 아님을 확인할 수 있습니다:

환경 변수 생성
이전에 생성한 쉘 변수는 export 명령을 사용하여 환경 변수로 변환할 수 있습니다. 먼저 쉘 변수를 생성합니다. 그런 다음 환경 변수를 생성하려면 export 명령을 사용해야 합니다. 이 명령을 실행하면 하위 쉘 및 프로세스에서 변수를 사용할 수 있게 됩니다:
|
1 |
export MY_FIRST_VAR |
이제 printenv 명령을 사용하여 테스트하면 변수와 값이 표시됩니다.

다음 구문을 사용하여 한 단계로 환경 변수를 생성할 수도 있습니다.
|
1 |
export MY_SECOND_VAR='이것은 나의 두 번째 변수입니다' |
환경 변수는 자식 셸로만 전달되고 부모 셸로는 전달되지 않습니다. 이는 자식 프로세스가 자신을 호출한 프로그램의 환경에 영향을 미치는 것을 방지하는 데 도움이 됩니다.
변수 강등 및 해제
지금까지 튜토리얼을 따라오셨다면 여전히 MY_FIRST_VAR가 환경 변수로 정의되어 있을 것입니다. –n 플래그와 함께 echo 명령을 입력하여 이를 다시 셸 변수로 변경할 수 있습니다.
|
1 |
export -n MY_FIRST_VAR |
printenv로 테스트하면 출력이 없습니다. 하지만 여전히 셸 변수이기 때문에 echo 명령은 이를 표시합니다:

unset 명령을 사용하여 셸 변수 또는 환경 변수를 해제할 수 있습니다. 그리고 echo를 사용하여 더 이상 존재하지 않는지 확인할 수 있습니다. 보시다시피 아무런 출력도 표시되지 않습니다:

로그인 시 환경 변수 설정
많은 프로그램이 실행을 위해 환경 변수에 의존합니다. 프로그램을 실행할 때마다 변수를 설정하는 것은 효율적이지 않기 때문에, Linux는 변수를 정의하고 파일에 저장하는 방법을 제공합니다. 이렇게 하면 로그인 시 자동으로 설정될 수 있습니다. 셸은 세션이 시작되는 방식에 따라 서로 다른 구성 파일을 읽습니다. 이에 대해서는 아래에서 설명합니다:
셸 세션의 유형 및 차이점
- 로그인 셸 세션 – 사용자 인증으로 시작됩니다. SSH 또는 터미널 세션을 통해 로그인할 때 세션이 설정됩니다.
- 비로그인 셸 세션 – 인증된 셸 내에서 새 셸을 시작할 때 시작됩니다. bash 명령을 사용하여 새 셸을 시작할 수 있습니다. 인증 정보는 필요하지 않습니다.
- 대화형 셸 세션 – 터미널 세션에 연결된 셸 세션입니다.
- 비대화형 셸 세션 – 터미널 세션에 연결되지 않은 셸 세션으로, 백그라운드에서 실행됩니다.
세션은 로그인 또는 비로그인, 그리고 대화형 또는 비대화형으로 분류됩니다. SSH를 통해 로그인하고 셸 세션을 시작하면, 이는 로그인 및 대화형 셸 세션이 됩니다. 터미널에서 스크립트를 실행하면 대개 비로그인 및 비대화형 세션에서 실행됩니다. 셸 세션은 이 두 가지가 조합된 형태일 수도 있습니다. 그렇다면 어떤 구성 파일이 선택될까요?
로그인 세션은 먼저 /etc/profile 디렉터리에서 구성 파일을 읽습니다. 둘째로, 사용자의 홈 디렉터리에서 사용자 고유의 구성 파일을 확인합니다. ~/.bash_profile, ~/.bash_login, ~/.profile 중 가장 먼저 발견된 파일 하나만 읽고 나머지 파일은 모두 무시됩니다. 비로그인 세션은 먼저 /etc/bash.bashrc를 읽은 다음 ~/.bashrc를 읽습니다. 비대화형 세션은 BASH_ENV라는 환경 변수를 읽어 새 환경을 정의하는 데 사용할 파일의 이름을 가져옵니다.
환경 변수 구현
변수를 설정할 때는 위의 논의를 바탕으로 항상 어떤 파일에 변수를 배치하는지 유의하십시오. 이렇게 하면 특정 변수가 특정 세션에서만 사용되도록 보장하여 유연성을 제공합니다. 중요한 변수가 특정 세션에서 누락되는 것을 원치 않으실 것입니다.
경우에 따라 로그인 및 비로그인 세션 모두에 변수가 존재하기를 원할 수 있습니다. 다행히도 대부분의 Linux 배포판은 기본적으로 로그인 구성이 비로그인 구성을 읽고 프로세스에서 사용할 수 있도록 구성되어 있습니다. 따라서 비로그인 구성 파일에 변수를 정의하기만 하면 됩니다. 보통 우리는 사용자 고유의 환경 변수를 설정하고 이 설정이 로그인 및 비로그인 셸 세션 모두에서 사용 가능하기를 원합니다. 이러한 이유로 ~/.bashrc 파일을 사용하겠습니다. 파일을 편집하기 위해 nano를 사용합니다. 터미널에 다음을 입력하여 파일을 엽니다:
|
1 |
nano ~/.bashrc |
열린 설정 파일에서 이미 여러 변수를 볼 수 있습니다. 명령줄을 사용할 때와 동일한 방식으로 환경 변수를 추가할 수 있습니다. 다음 명령을 입력하기만 하면 됩니다:
|
1 |
export KEYNAME=value. |
파일의 어느 곳이든 새 줄에 추가할 수 있으며, 루프 함수 내부가 아니어야 합니다. 그런 다음 파일을 저장하고 닫습니다. 이후에 시작하는 모든 셸 세션은 이 파일에서 설정을 읽어옵니다. 현재 셸을 재시작하지 않고 방금 추가한 설정을 적용하려면 다음 명령을 사용할 수 있습니다:
|
1 |
source ~/.bashrc |
시스템 전역 환경 변수는 다음 중 하나에 추가해야 합니다: /etc/profile, /etc/bash.bashrc 또는 /etc/environment.
요약하자면
마지막으로, 이제 셸 및 환경 변수를 설정하고 이러한 도구가 VPS에 제공하는 강력한 기능을 누릴 수 있습니다! 일부 프로세스의 실행 자동화, 인증 정보가 필요한 자동 배포 구성, 하위 프로세스로 변수 전달 등 많은 장점이 있습니다. 환경 변수는 다른 데이터 중에서도 인증 정보와 같은 민감한 데이터를 공개 저장소로부터 숨기는 데 도움이 됩니다. 이러한 기반을 통해 사용자의 지속적인 입력 없이도 명령줄을 통해 자동으로 실행할 수 있는 복잡한 스크립트를 만들 수 있습니다.
즐거운 컴퓨팅 되세요!
댓글
아직 댓글이 없습니다. 첫 번째로 작성해 보세요.