🐧 Linux 심화: 셸(Shell) 스크립트와 환경 설정

오늘은 리눅스의 핵심 인터페이스인 셸(Shell) 의 다양한 기능과 변수, 그리고 환경 설정 방법에 대해 깊이 있게 학습했다. 특히, Bash 셸을 중심으로 로컬 변수와 환경 변수의 차이를 이해하고, 나만의 설정을 시스템에 영구적으로 적용하는 방법을 익혔다.

💡 셸, 왜 중요할까?

셸은 사용자와 리눅스 커널을 연결하는 다리다. 단순히 명령어를 실행하는 것을 넘어, 변수, 스크립트, 환경 설정을 통해 반복적인 작업을 자동화하고 사용자 환경을 최적화할 수 있는 강력한 도구다. 셸을 잘 다루는 것은 리눅스 시스템을 효율적으로 관리하기 위한 필수 역량이다.


🐚 셸(Shell)의 종류와 서브셸

리눅스는 다양한 셸을 제공하며, 사용자는 필요에 따라 셸을 선택하거나 추가로 설치할 수 있다.

셸 종류 설명
sh (본 셸) 가장 기본적인 셸. 유닉스 최초의 셸에서 유래했다.
bash (본 어게인 셸) 현재 대부분의 리눅스 배포판에서 기본 셸로 사용된다. sh의 확장된 버전.
csh, tcsh C언어와 유사한 문법을 가진 셸.
ksh (콘 셸) sh의 기능을 확장하고 스크립트 프로그래밍 기능을 강화한 셸.
zsh (Z 셸) bash를 포함한 여러 셸의 장점을 통합한 강력한 셸. (e.g., oh-my-zsh)

서브셸(Subshell)이란?
현재 실행 중인 셸에서 새로운 셸을 실행할 때, 새로 생긴 셸을 서브셸이라고 한다. 서브셸은 부모 셸의 환경 변수를 상속받지만, 서브셸에서 변경된 내용은 부모 셸에 영향을 주지 않는다.

# 현재 시스템에 설치된 셸 종류 확인
$ cat /etc/shells

# 현재 프로세스 구조 확인 (로그인 셸)
$ ps --forest
  PID TTY          TIME CMD
 1096 pts/0    00:00:00 bash

# 서브셸(sh) 실행
$ sh

# 서브셸이 실행된 후 프로세스 구조 확인
$ ps --forest
  PID TTY          TIME CMD
 1096 pts/0    00:00:00 bash
 1363 pts/0    00:00:00  \_ sh

⚙️ 셸 변수: 로컬 변수 vs. 환경 변수

셸 변수는 데이터 저장을 위해 사용되며, 로컬 변수환경 변수로 나뉜다.

구분 로컬 변수 (Local Variable) 환경 변수 (Environment Variable)
범위 현재 셸에서만 유효 현재 셸과 모든 서브셸에까지 영향을 미침
선언 변수명=값 export 변수명=값 또는 export 변수명
확인 set 명령어 출력에만 포함 envset 명령어 출력 모두에 포함

💡 변수명 규칙 및 쿼팅(Quoting)

  • 변수명은 문자로 시작해야 하며, 숫자, 밑줄(_)을 포함할 수 있다. (하이픈 - 사용 불가)
  • 작은따옴표(' ')는 내부의 모든 특수문자(e.g., $, $(...))를 일반 문자로 취급한다.
  • 큰따옴표(" ")는 $, \, `, {} 등 일부 특수문자의 기능을 허용한다. (명령어 치환 가능)

변수 선언 및 확인 실습

# 로컬 변수 선언
$ myName="John Doe"

# 환경 변수 선언
$ export myFoot="280mm"

# 변수 값 확인
$ echo "My name is $myName and my foot size is $myFoot"

# env와 set으로 변수 범위 확인
$ env | grep my # myFoot만 출력됨 (환경 변수)
$ set | grep my # myName과 myFoot 모두 출력됨

# 서브셸에서 변수 확인
$ bash
$ echo $myName # 출력되지 않음 (로컬 변수)
$ echo $myFoot # 280mm 출력됨 (환경 변수)
$ exit

# 변수 삭제
$ unset myName

🛠️ Bash 환경 설정 파일

셸이 시작될 때 특정 설정을 자동으로 적용하기 위해 환경 설정 파일을 사용한다. 이를 통해 aliasPATH 같은 설정을 영구적으로 유지할 수 있다.

파일 경로 설명 적용 시점
/etc/profile 시스템 전체에 적용되는 환경 설정 모든 사용자가 로그인할 때
~/.profile 개인 사용자를 위한 환경 설정 해당 사용자가 로그인할 때 (최초 1회)
~/.bashrc 개인 사용자를 위한 Bash 관련 설정 로그인 셸 또는 서브셸이 실행될 때마다

💡 alias로 나만의 단축 명령어 만들기

alias는 긴 명령어를 짧은 별칭으로 만들어 생산성을 높여준다.

# 'rm' 실행 시 항상 확인 메시지를 띄우도록 alias 설정
alias rm='rm -i'

# 'll'을 'ls -l --color=auto'로 설정
alias ll='ls -l --color=auto'

이 설정을 영구적으로 사용하려면 ~/.bashrc 파일에 추가하면 된다.

설정 파일 적용 및 확인

# 1. .bashrc 파일에 alias 추가
$ vi ~/.bashrc
# 파일 맨 아래에 다음 내용 추가
alias mytime='date | cut -c17-24'
PS1="\[\e[32m\][\u@\h \W]\$ \[" # 프롬프트 색상 변경

# 2. .profile 파일에 환경 변수 추가
$ vi ~/.profile
# 파일 맨 아래에 다음 내용 추가
export myHairColor="Black"

# 3. 변경된 설정 즉시 적용
$ source ~/.bashrc
$ source ~/.profile

# 4. 확인
$ mytime
$ echo $myHairColor

✨ 오늘의 회고

  • Bash를 포함한 다양한 셸의 종류서브셸의 개념을 이해했다.
  • 로컬 변수환경 변수의 차이점을 명확히 구분하고, export 명령어로 환경 변수를 설정하는 방법을 익혔다.
  • 변수 선언 시 쿼팅(' ', " ") 의 차이와 중요성을 파악했다.
  • /etc/profile, ~/.profile, ~/.bashrc 등 환경 설정 파일의 역할과 적용 시점을 학습하고, 이를 통해 alias와 환경 변수를 영구적으로 설정하는 방법을 실습했다.
  • source 명령어를 사용하여 수정한 설정 파일을 즉시 현재 셸에 적용할 수 있음을 확인했다.