소개
프로그램은 홈 디렉터리, 언어, 검색 경로 또는 애플리케이션 설정과 같은 작은 구성 정보를 자주 필요로 합니다. Linux 프로세스는 이름과 문자열 값으로 구성된 환경을 통해 이러한 값 중 상당수를 전달받습니다.
이 실습에서는 환경 변수의 개념을 단계적으로 익힙니다. 먼저 현재 셸에만 속하는 변수를 만든 다음, 자식 프로세스에 변수를 내보내고, 표준 변수를 확인하고, PATH를 확장하고, 이후 Zsh 세션에도 설정이 적용되도록 만듭니다. 각 단계에서는 셸이 실제로 수행한 작업을 확인할 수 있도록 파일이나 명령 결과를 남깁니다.
셸 변수 생성 및 확장
이 단계에서는 셸 변수를 만들고 인용 부호가 변수 확장에 어떤 영향을 주는지 확인합니다.
셸 변수는 현재 셸 안에서 이름과 값을 연결합니다. 대입 구문에서 = 앞뒤에는 공백을 넣지 않습니다. 값을 인용하면 포함된 공백을 그대로 유지할 수 있습니다.
cd /home/labex/project/environment-lab
course_name="Linux for Noobs"
이름 앞에 $를 붙이면 셸은 해당 이름을 값으로 확장합니다.
echo "$course_name"
큰따옴표는 변수 확장을 허용하면서 결과를 하나의 인수로 유지합니다. 작은따옴표는 달러 기호를 문자 그대로 유지합니다. 두 결과를 비교합니다.
printf 'double: %s\n' "$course_name"
printf 'single: %s\n' '$course_name'
확장된 값을 확인 가능한 결과 파일에 저장합니다.
printf 'course=%s\n' "$course_name" > shell-variable.txt
cat shell-variable.txt
이 변수는 내보내지 않는 한 현재 셸에서만 존재합니다.
자식 프로세스의 변수 상속 확인
이 단계에서는 자식 프로세스 안에서 일반 셸 변수와 내보낸 변수를 비교합니다.
모든 명령은 하나의 프로세스에서 실행됩니다. 자식 프로세스는 부모 프로세스에서 내보낸 환경 변수를 전달받지만, 일반 셸 변수는 전달받지 못합니다.
작업 디렉터리로 돌아가 두 종류의 변수를 각각 하나씩 만듭니다.
cd /home/labex/project/environment-lab
local_message="visible only in this shell"
export SHARED_MESSAGE="visible in child processes"
두 변수 이름을 모두 출력하는 간단한 Bash 자식 프로세스를 만듭니다. 인용된 heredoc 구분자는 스크립트를 작성하는 동안 현재 셸이 변수를 확장하지 않도록 합니다.
cat > inspect-child.sh <<'EOF'
#!/bin/bash
printf 'local=%s\n' "${local_message:-<missing>}"
printf 'shared=%s\n' "${SHARED_MESSAGE:-<missing>}"
EOF
chmod +x inspect-child.sh
스크립트를 실행하고 출력을 파일로 리디렉션한 다음 파일 내용을 표시합니다. 다음 명령을 분리해 실행하면 어떤 명령이 자식 프로세스를 실행하고 어떤 명령이 저장된 결과를 확인하는지 명확하게 알 수 있습니다.
./inspect-child.sh > child-environment.txt
cat child-environment.txt
일반 변수는 <missing>으로 표시되고 SHARED_MESSAGE는 상속됩니다. 내보낸 이름이 환경에 존재하는지 확인합니다.
env | grep '^SHARED_MESSAGE='
표준 환경 변수 확인
이 단계에서는 계정, 작업 디렉터리, 터미널, 명령 검색 경로를 나타내는 표준 변수를 확인합니다.
Linux 셸은 일반적으로 다음과 같은 유용한 표준 변수를 제공합니다.
HOME은 홈 디렉터리입니다.USER는 계정 이름입니다.SHELL은 구성된 로그인 셸입니다.PWD는 현재 작업 디렉터리를 나타냅니다.PATH는 콜론으로 구분된 명령 검색 디렉터리 목록입니다.TERM은 대화형 프로그램에 터미널 기능을 설명합니다.
내보낸 변수를 이름으로 읽는 printenv를 사용해 선택한 값을 표시합니다.
printenv HOME USER SHELL PWD TERM
PATH는 항목을 한 줄에 하나씩 표시하면 읽기 쉽습니다. tr을 사용해 값을 전달하면서 각 콜론을 줄바꿈으로 바꿉니다.
printf '%s\n' "$PATH" | tr ':' '\n'
이 실습에서 예상 값을 알고 있는 변수로 안정적인 보고서를 만듭니다.
cd /home/labex/project/environment-lab
printf 'HOME=%s\nUSER=%s\n' "$HOME" "$USER" > standard-environment.txt
cat standard-environment.txt
개인 명령으로 PATH 확장
이 단계에서는 개인 실행 파일 디렉터리를 PATH에 추가하고, 다른 디렉터리에서 이름만으로 명령을 실행합니다.
슬래시 없이 명령을 입력하면 셸은 PATH에 있는 디렉터리를 왼쪽부터 오른쪽 순서로 검색합니다. 기존 검색 경로를 바꾸지 않고 개인 실행 파일 디렉터리를 추가할 수 있습니다.
course-status라는 명령을 만듭니다.
mkdir -p "$HOME/bin"
cat > "$HOME/bin/course-status" <<'EOF'
#!/bin/bash
echo "Linux learning environment is ready"
EOF
chmod +x "$HOME/bin/course-status"
현재 PATH에 디렉터리를 추가합니다. $PATH를 유지해야 표준 명령에 계속 접근할 수 있습니다.
export PATH="$PATH:$HOME/bin"
셸이 실행할 파일을 확인한 다음, 다른 디렉터리에서 명령을 실행합니다.
command -v course-status
cd /tmp
course-status
출력을 실습 작업 공간에 저장합니다.
course-status > /home/labex/project/environment-lab/path-command.txt
이후 Zsh 세션을 위한 설정 유지
이 단계에서는 이후 Zsh 세션을 구성하고 지속되는 설정과 현재 셸의 상태를 구분합니다.
export는 현재 프로세스와 이후에 생성되는 자식 프로세스를 변경하지만 구성 파일을 수정하지는 않습니다. 설정이 이후 터미널에도 적용되려면 시작 파일이 해당 설정을 다시 만들어야 합니다. LabEx Terminal 은 Zsh 를 사용하며, 대화형 시작 파일은 ~/.zshrc입니다.
명확하게 표시한 블록을 파일 끝에 추가합니다. 새 대화형 Zsh 가 시작될 때마다 각 export 줄이 환경 설정을 하나씩 다시 만듭니다. 이 초보자용 예제에서는 시작 파일을 의도적으로 단순하게 유지합니다. 기존 PATH를 보존한 뒤 끝에 개인 디렉터리를 추가합니다.
cat >> "$HOME/.zshrc" <<'EOF'
## LABEX_ENV_LAB_START
export PROJECT_DIR="$HOME/project"
export PATH="$PATH:$HOME/bin"
## LABEX_ENV_LAB_END
EOF
source 명령은 현재 셸에서 파일을 읽습니다. Terminal 을 닫지 않고도 설정을 사용할 수 있도록 지금 .zshrc를 다시 읽습니다.
source "$HOME/.zshrc"
다시 읽은 변수를 사용할 수 있는지 확인합니다.
printf 'PROJECT_DIR=%s\n' "$PROJECT_DIR"
PROJECT_DIR=/home/labex/project가 표시되어야 합니다. 새 Zsh 프로세스를 시작해 이후 세션에서도 동일한 설정이 로드되는지 확인할 수도 있습니다. zsh -ic에서 -i는 .zshrc를 읽는 대화형 셸을 요청하고, -c는 해당 셸이 실행할 명령을 지정합니다. 두 줄의 출력을 future-shell.txt에 리디렉션한 다음 파일을 확인합니다.
zsh -ic 'printf "PROJECT_DIR=%s\n" "$PROJECT_DIR"; command -v course-status' > /home/labex/project/environment-lab/future-shell.txt
cat /home/labex/project/environment-lab/future-shell.txt
첫 번째 줄에는 /home/labex/project가 표시되고, 두 번째 줄에는 /home/labex/bin/course-status가 표시되어야 합니다.
마지막으로 현재 상태와 지속되는 설정의 차이를 확인합니다. 임시 환경 변수를 만들었다가 삭제합니다.
export TEMP_NOTE="remove me"
printenv TEMP_NOTE
unset TEMP_NOTE
printenv TEMP_NOTE
마지막 printenv는 이름이 더 이상 존재하지 않기 때문에 아무것도 출력하지 않고 0 이 아닌 상태 코드를 반환합니다. unset은 현재 셸에서 해당 이름을 제거합니다. 시작 파일에 같은 이름이 계속 정의되어 있으면 해당 구성 줄을 삭제할 때까지 이후 셸이 그 이름을 다시 만듭니다.
요약
자주 혼동하는 세 가지 메커니즘을 확인했습니다. 셸 변수는 하나의 셸에 속하고, export는 값을 자식 프로세스에 전달하며, 시작 파일은 이후 셸에서 설정을 다시 만듭니다. 또한 표준 환경 변수를 확인하고, 기존 항목을 유지하면서 PATH를 확장하고, 명령 검색을 검증하고, unset으로 임시 상태를 제거했습니다.



