리눅스 셸 환경 및 설정 관리

CompTIABeginner
지금 연습하기

소개

이 실습에서는 리눅스 셸 환경과 설정을 관리하는 핵심 기초를 배웁니다. 먼저 로컬 변수와 환경 변수를 생성하는 것부터 시작하여, echo, export, env와 같은 명령어를 사용해 셸 세션 내에서 변수의 범위 (Scope) 와 가용성의 차이를 이해하게 됩니다.

이러한 기초를 바탕으로 변수와 별칭 (Alias) 이 자식 셸에 어떻게 상속되는지 살펴봅니다. 또한 set -o allexport 옵션을 통해 변수를 자동으로 내보내는 방법을 제어하고, .bashrc 파일을 수정하여 사용자 정의 설정이 세션이 종료된 후에도 유지되도록 만드는 방법을 학습합니다.

이 실습은 학습과 연습을 돕기 위해 단계별 지침을 제공하는 가이드 실습입니다. 각 단계를 주의 깊게 따라하며 실무 경험을 쌓으세요. 통계 데이터에 따르면 이 실습은 완료율 86%초급 수준이며, 학습자들로부터 100%의 긍정적인 평가를 받았습니다.

로컬 변수와 환경 변수의 생성 및 차이점 이해

이 단계에서는 셸 변수를 생성하고 관리하는 방법을 배웁니다. Zsh 와 같은 리눅스 셸에서 변수는 정보를 저장하는 데 사용됩니다. 변수에는 크게 두 가지 유형이 있습니다.

  • 로컬 변수(또는 셸 변수): 변수가 생성된 해당 셸 내에서만 사용할 수 있습니다.
  • 환경 변수: 현재 셸뿐만 아니라 해당 셸에서 시작된 모든 자식 프로세스에서도 사용할 수 있습니다.

이러한 변수들을 다루기 위해 echo, export, env 명령어를 사용합니다. 모든 명령어는 터미널에서 실행됩니다.

먼저 로컬 변수를 생성해 보겠습니다. 이미 ~/project 디렉토리에 위치한 터미널에서 다음 명령어를 입력하여 flower라는 이름의 변수를 생성하고 rose라는 값을 할당합니다. 등호 (=) 앞뒤에 공백이 없어야 함에 주의하세요.

flower=rose

변수가 제대로 생성되었는지 확인하기 위해 echo 명령어를 사용하여 값을 출력해 봅니다. 변수 이름 앞에 붙는 달러 기호 ($) 는 셸에게 해당 변수를 그 값으로 치환하라는 의미입니다.

echo $flower

터미널에 변수 값이 출력되는 것을 확인할 수 있습니다.

rose

이제 이 로컬 변수가 셸 환경의 일부인지 확인해 보겠습니다. env 명령어는 모든 환경 변수를 나열합니다. 이 출력을 grep으로 전달 (Pipe) 하여 우리가 만든 변수를 검색할 수 있습니다.

env | grep flower

이 명령어는 아무런 결과도 출력하지 않습니다. 이는 예상된 결과이며, flower가 환경 변수가 아닌 로컬 변수임을 증명합니다.

다음으로 환경 변수를 생성해 보겠습니다. 과정은 비슷하지만 export 명령어를 사용합니다. 이 명령어는 변수를 생성함과 동시에 현재 셸의 모든 자식 프로세스에 전달되도록 표시합니다. 값이 almondnut이라는 환경 변수를 만들어 봅시다.

export nut=almond

이전과 마찬가지로 echo를 통해 확인합니다.

echo $nut

명령어가 nut 변수의 값을 출력합니다.

almond

이제 env 명령어를 다시 사용하여 환경에 존재하는지 확인해 봅니다.

env | grep nut

이번에는 명령어가 변수를 찾아 표시하며, nut이 환경 변수임을 확인시켜 줍니다.

nut=almond

이제 로컬 변수와 환경 변수를 모두 성공적으로 생성했으며, 셸 환경에서 이들이 처리되는 근본적인 차이점을 확인했습니다. 이 변수들은 다음 단계에서 사용하기 위해 그대로 유지합니다.

자식 셸에서의 변수 및 별칭 상속 테스트

이 단계에서는 현재 셸에서 새로운 셸을 시작할 때 변수와 별칭이 어떻게 동작하는지 살펴봅니다. 이 새로운 셸을 "자식 셸 (Child Shell)"이라고 하며, 원래의 셸을 "부모 셸 (Parent Shell)"이라고 부릅니다. 이 개념은 셸 환경이 어떻게 구성되고 스크립트가 어떻게 실행되는지 이해하는 데 매우 중요합니다. 이전 단계에서 만든 flowernut 변수가 자식 셸로 전달 (상속) 되는지 테스트해 보겠습니다.

먼저 현재 부모 셸의 프로세스 ID(PID) 를 확인합니다. 리눅스의 모든 프로세스는 고유한 PID 를 가집니다. echo $$ 명령어로 확인할 수 있습니다.

echo $$

출력되는 숫자가 현재 셸의 PID 입니다. 예시는 다음과 같습니다.

123

이제 zsh를 입력하고 엔터를 눌러 자식 셸을 시작합니다. 이는 현재 프로세스 내부에서 새로운 셸 프로세스를 생성합니다.

zsh

이제 새로운 셸 세션에 들어왔습니다. 이를 확인하기 위해 부모 프로세스 ID(PPID) 를 포함한 상세 프로세스 정보를 보여주는 ps -f 명령어를 사용합니다.

ps -f

출력을 살펴보세요. 두 개의 zsh 프로세스가 보일 것입니다. 새로운 zsh 프로세스의 PID 는 앞서 확인한 부모 셸의 PID 와 일치하는 PPID 를 가지고 있어야 합니다.

UID          PID    PPID  C STIME TTY          TIME CMD
labex        123       1  0 10:00 pts/0    00:00:00 zsh
labex        456     123  0 10:01 pts/0    00:00:00 zsh
labex        457     456  0 10:01 pts/0    00:00:00 ps -f

이 예시에서 새로운 셸 (PID 456) 은 원래 셸 (PPID 123) 의 자식입니다.

이제 변수를 테스트해 봅시다. 이 자식 셸에서 로컬 변수 flower의 값을 표시해 봅니다.

echo $flower

아무것도 출력되지 않습니다. 로컬 변수는 생성된 셸 내에만 갇혀 있으며 자식 셸로 상속되지 않기 때문입니다.

다음으로 환경 변수 nut을 확인합니다.

echo $nut

이번에는 셸이 변수 값을 출력합니다.

almond

이는 로컬 변수와 달리 환경 변수는 자식 셸로 상속된다는 것을 보여줍니다.

이제 exit 명령어를 사용하여 부모 셸로 돌아갑니다.

exit

다시 원래의 셸로 돌아왔습니다. 별칭 (Alias) 으로 비슷한 테스트를 진행해 보겠습니다. 별칭은 명령어의 단축어입니다. ls -ld /etc를 실행하는 ldetc라는 별칭을 만듭니다.

alias ldetc='ls -ld /etc'

alias 명령어를 입력하여 별칭이 생성되었는지 확인합니다.

alias ldetc

정의된 별칭이 표시되어야 합니다.

ldetc='ls -ld /etc'

이제 별칭을 실행하여 테스트해 봅니다.

ldetc

명령어가 ls -ld /etc를 실행하고 /etc 디렉토리의 상세 정보를 보여줍니다.

drwxr-xr-x 1 root root 4096 Oct 10 10:00 /etc

이제 다시 자식 셸을 열어 별칭이 상속되는지 확인합니다.

zsh

새로운 자식 셸 내부에서 ldetc 별칭을 사용해 봅니다.

ldetc

오류 메시지가 나타납니다. 별칭 역시 로컬 변수와 마찬가지로 자식 셸에 상속되지 않기 때문입니다.

zsh: command not found: ldetc

부모 셸로 돌아갑니다.

exit

마지막으로 unalias 명령어를 사용하여 부모 셸에서 별칭을 제거하여 정리합니다.

unalias ldetc

다시 조회하여 제거되었는지 확인합니다.

alias ldetc

아무것도 반환되지 않습니다.

이 연습을 통해 셸 동작의 핵심 원칙을 배웠습니다. 환경 변수는 자식 프로세스에 상속되지만, 로컬 변수와 별칭은 상속되지 않습니다.

set -o allexport를 이용한 자동 변수 내보내기 제어

이 단계에서는 allexport라는 강력한 셸 옵션에 대해 배웁니다. 보통 변수를 생성할 때 환경 변수로 만들려면 명시적으로 export 명령어를 사용해야 합니다. 하지만 allexport 옵션을 활성화하면, 정의하는 모든 새로운 변수를 자동으로 내보내도록 셸에 지시할 수 있습니다. 이는 모든 변수가 하위 프로세스에서 사용 가능해야 하는 스크립트 작업 시 매우 편리한 단축 방법이 될 수 있습니다.

셸 옵션은 셸의 동작을 변경하는 내부 설정입니다. set -o [옵션명]으로 켜고, set +o [옵션명]으로 끌 수 있습니다.

먼저 allexport 옵션의 현재 상태를 확인해 보겠습니다. 모든 셸 옵션을 나열하고 grep을 사용하여 allexport만 필터링할 수 있습니다.

set -o | grep allexport

기본적으로 이 옵션은 꺼져 있습니다. 출력 결과에 상태가 off로 표시됩니다.

allexport              off

이제 allexport 옵션을 켭니다.

set -o allexport

확인 명령어를 다시 실행하여 설정이 변경되었는지 확인합니다.

set -o | grep allexport

이번에는 옵션이 on으로 표시될 것입니다.

allexport              on

allexport가 활성화된 상태에서는 export 명령어를 쓰지 않고 생성한 모든 변수가 자동으로 환경 변수가 됩니다. 테스트해 봅시다. export 없이 truck이라는 새 변수를 만듭니다.

truck=chevy

이제 env 명령어를 사용하여 truck이 환경에 존재하는지 확인합니다.

env | grep truck

export를 사용하지 않았음에도 truck 변수가 목록에 나타나는 것을 볼 수 있습니다. 이는 allexport 옵션이 활성화되어 있었기 때문입니다.

truck=chevy

이 기능은 매우 유용할 수 있지만, 의도치 않게 변수를 내보내는 것을 방지하기 위해 필요하지 않을 때는 다시 끄는 것이 좋습니다. allexport를 끕니다.

set +o allexport

마지막으로 꺼졌는지 확인합니다.

set -o | grep allexport

출력 결과에 다시 off로 표시됩니다.

allexport              off

이제부터 생성하는 새로운 변수들은 명시적으로 export를 사용하지 않는 한 기본적으로 로컬 변수가 됩니다.

.bashrc 파일을 이용한 셸 옵션 영구 적용

이 단계에서는 셸 사용자 정의 설정을 영구적으로 유지하는 방법을 배웁니다. 여러분이 설정한 별칭, 함수, 셸 옵션은 임시적이며 터미널 세션을 닫으면 사라집니다. 이를 영구적으로 저장하려면 셸 설정 파일에 추가해야 합니다.

제목에는 Bash 셸의 설정 파일인 .bashrc가 언급되어 있지만, 우리 실습 환경은 Zsh 셸을 사용합니다. Zsh 에서 이에 해당하는 설정 파일은 ~/.zshrc입니다. 이 파일은 새로운 대화형 셸을 열 때마다 자동으로 실행되는 스크립트로, 개인 설정을 저장하기에 최적의 장소입니다.

noclobber 셸 옵션을 영구적으로 적용하는 연습을 해보겠습니다. noclobber 옵션은 출력 리다이렉션 (>) 을 사용할 때 실수로 기존 파일을 덮어쓰는 것을 방지해 줍니다.

먼저 nano 텍스트 편집기를 사용하여 ~/.zshrc 파일에 noclobber 옵션을 추가합니다. ~ 기호는 홈 디렉토리인 /home/labex를 가리키는 단축 경로입니다.

nano ~/.zshrc

이 명령어는 nano 편집기에서 ~/.zshrc 파일을 엽니다. 화살표 키를 사용하여 파일의 맨 끝으로 이동한 후 다음 줄을 추가합니다.

set -o noclobber

이제 파일을 저장하고 nano를 종료합니다. Ctrl+O(Write Out) 를 누르고 Enter를 눌러 파일 이름을 확인한 다음, Ctrl+X를 눌러 나갑니다.

다시 명령 프롬프트로 돌아왔습니다. 현재 셸에서 noclobber 옵션이 활성화되어 있는지 확인해 봅시다.

set -o | grep noclobber

출력 결과는 다음과 같습니다.

noclobber              off

왜 꺼져 있을까요? 현재 셸 세션은 방금 ~/.zshrc 파일에 수정한 내용을 아직 읽지 않았기 때문입니다. 이 파일은 새로운 셸이 시작될 때만 읽힙니다.

이를 증명하기 위해 새로운 자식 셸을 시작해 봅니다.

zsh

이제 새로운 셸에 들어왔습니다. 여기서 noclobber 상태를 확인합니다.

set -o | grep noclobber

이번에는 출력 결과가 다음과 같습니다.

noclobber              on

새로운 셸이 ~/.zshrc 파일을 올바르게 읽고 설정을 적용했음을 확인할 수 있습니다. 이제 자식 셸을 종료하고 원래의 부모 셸로 돌아갑니다.

exit

그렇다면 셸을 닫고 다시 열지 않고 현재 셸에 변경 사항을 적용하려면 어떻게 해야 할까요? 현재 셸의 컨텍스트에서 파일의 명령어를 읽고 실행하는 source 명령어를 사용하면 됩니다.

source ~/.zshrc

이제 source 명령어가 설정 파일의 set -o noclobber 줄을 실행했습니다. 원래 셸에서 noclobber가 켜졌는지 확인해 봅니다.

set -o | grep noclobber

이제 출력 결과는 다음과 같습니다.

noclobber              on

~/.zshrc 파일을 편집하여 셸 설정을 영구적으로 유지하는 방법과 source 명령어를 사용하여 해당 변경 사항을 현재 세션에 즉시 적용하는 방법을 성공적으로 익혔습니다.

요약

이 실습에서는 리눅스 셸 환경을 관리하는 핵심 개념을 배웠습니다. 현재 셸에 국한되는 로컬 변수와 모든 자식 프로세스에 상속되는 환경 변수를 생성하는 연습을 했습니다. 변수 값을 표시하는 echo, 환경 변수를 생성하는 export, 그리고 변수 목록을 확인하는 env와 같은 주요 명령어들을 활용했습니다. 또한 자식 셸을 실행하여 부모 셸로부터 어떤 변수와 별칭이 성공적으로 전달되는지 테스트함으로써 상속의 개념을 깊이 있게 탐구했습니다.

더 나아가 셸 설정을 제어하고 유지하는 방법도 살펴보았습니다. set -o allexport 옵션을 사용하여 이후 정의되는 모든 변수를 자동으로 내보냄으로써 자식 프로세스에서 변수를 쉽게 사용할 수 있도록 만드는 과정을 간소화했습니다. 마지막으로, 사용자 정의 변수, 별칭, 셸 옵션이 향후 모든 터미널 세션에서 유지되도록 .bashrc(또는 .zshrc) 시작 파일에 설정을 추가하여 환경 구성을 영구적으로 만드는 방법을 학습했습니다.