Skip to main content
Summary

셸 환경은 내 책상 배치와 같습니다

터미널을 처음 배울 때는 명령어 하나하나를 정확히 입력하는 데 집중합니다. 하지만 매일 같은 명령을 반복하다 보면 자연스럽게 이런 생각이 듭니다.

"이 긴 명령을 매번 입력해야 할까?"

셸 환경 설정은 책상 배치를 바꾸는 일과 비슷합니다. 자주 쓰는 도구를 손 가까이에 두고, 헷갈리는 물건에는 이름표를 붙이고, 위험한 작업에는 확인 절차를 넣습니다. Linux에서는 이런 일을 alias, 함수, 환경 변수, 시작 스크립트, 프롬프트 설정으로 할 수 있습니다.

이 장에서는 Bash를 기준으로 설명합니다. 현재 셸은 다음 명령으로 확인합니다.

echo $SHELL

출력이 /bin/bash라면 이 장의 예제를 그대로 따라 해도 좋습니다. /bin/zsh처럼 다른 셸을 사용한다면 개념은 비슷하지만 설정 파일 이름과 문법이 일부 다를 수 있습니다.

셸 환경을 내 작업 방식에 맞게 바꾸기AI 생성 이미지

alias로 긴 명령을 짧게 줄이기

alias는 긴 명령에 짧은 별명을 붙이는 기능입니다. 예를 들어 파일 목록을 자세히 보려고 매번 ls -alF를 입력한다면, 이를 ll이라는 짧은 이름으로 만들 수 있습니다.

alias ll='ls -alF'
ll

이 설정은 현재 터미널에서만 유효합니다. 터미널을 닫으면 사라집니다. 먼저 임시로 만들어 보고 마음에 들 때만 설정 파일에 저장하는 습관이 안전합니다.

자주 쓰는 예시는 다음과 같습니다.

alias la='ls -A'
alias l='ls -CF'
alias grep='grep --color=auto'
alias dfh='df -h'
alias duh='du -h --max-depth=1'

별칭이 실제로 어떻게 등록되어 있는지는 다음처럼 확인합니다.

alias
alias ll

별칭을 지우려면 unalias를 사용합니다.

unalias ll

주의할 점도 있습니다. rm, cp, mv 같은 명령에 확인 옵션을 붙이는 별칭은 초보자에게 도움이 될 수 있습니다.

alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'

하지만 이것을 안전장치로만 믿으면 안 됩니다. 별칭은 스크립트나 다른 셸 환경에서는 적용되지 않을 수 있습니다. 또한 앞에 command를 붙이면 별칭을 건너뛴 원래 명령이 실행됩니다.

command rm file.txt

삭제 전에는 여전히 pwd, ls, find -print로 위치와 대상을 확인해야 합니다.

function으로 작은 작업 흐름 만들기

alias는 단순한 치환에 적합합니다. 하지만 인자를 받아 처리하거나 여러 명령을 순서대로 실행하려면 함수가 더 낫습니다.

예를 들어 새 디렉터리를 만들고 바로 이동하는 작업은 자주 반복됩니다.

mkcd() {
  mkdir -p "$1" && cd "$1"
}

사용은 이렇게 합니다.

mkcd ~/linux-practice/shell-env
pwd

여기서 "$1"은 함수에 전달된 첫 번째 인자입니다. 큰따옴표를 붙인 이유는 경로에 공백이 들어가도 하나의 값으로 처리하기 위해서입니다. &&는 앞 명령이 성공했을 때만 뒤 명령을 실행하라는 뜻입니다. 즉, 디렉터리 생성에 실패하면 이동하지 않습니다.

조금 더 안전한 예시도 보겠습니다. 현재 디렉터리에서 큰 항목을 확인하는 함수입니다.

bigfiles() {
  du -h --max-depth=1 "${1:-.}" | sort -h
}
bigfiles
bigfiles /var/log

${1:-.}은 첫 번째 인자가 있으면 그것을 쓰고, 없으면 현재 디렉터리 .을 사용하라는 뜻입니다. 이런 기본값 처리는 함수를 실사용 도구처럼 만들어 줍니다.

함수 정의를 확인하려면 다음 명령을 씁니다.

type mkcd
type bigfiles

type은 입력한 이름이 명령인지, 별칭인지, 함수인지 알려 줍니다. 어떤 명령이 예상과 다르게 동작할 때 먼저 확인하면 좋습니다.

환경 변수와 export 이해하기

변수는 이름표가 붙은 값입니다. 셸에서는 다음처럼 변수를 만들 수 있습니다.

project=linux-practice
echo $project

공백을 넣으면 안 됩니다.

project = linux-practice   # 잘못된 예

이 변수는 현재 셸 안에서만 보입니다. 그런데 셸에서 실행한 하위 프로그램에도 값을 넘겨야 할 때가 있습니다. 이때 export를 사용합니다.

export EDITOR=nano
export LANG=ko_KR.UTF-8

export된 변수는 현재 셸이 실행하는 프로그램에게 전달됩니다. 비유하면 내 책상 위 메모를 나만 보는 것이 일반 변수라면, export는 내가 부른 작업자에게도 같은 메모를 복사해서 건네는 것입니다.

현재 환경 변수는 다음 명령으로 확인합니다.

env
printenv PATH

특정 변수가 셸 변수인지 환경 변수인지 헷갈릴 때는 echo와 printenv를 비교해 볼 수 있습니다.

echo $EDITOR
printenv EDITOR

echo는 셸이 알고 있는 값을 보여 주고, printenv는 환경 변수로 전달된 값만 보여 줍니다.

PATH에 내 실행 파일 경로 추가하기

명령어를 입력하면 셸은 아무 곳이나 뒤지지 않습니다. PATH라는 환경 변수에 적힌 디렉터리들을 왼쪽에서 오른쪽 순서로 찾습니다.

echo $PATH

출력은 보통 :로 구분된 긴 경로 목록입니다.

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

직접 만든 스크립트를 어디서나 실행하고 싶다면 보통 ~/bin 또는 ~/.local/bin을 사용합니다. 먼저 디렉터리를 만듭니다.

mkdir -p ~/.local/bin

간단한 테스트 스크립트를 만들어 보겠습니다.

nano ~/.local/bin/hello-linux

내용은 다음처럼 입력합니다.

#!/usr/bin/env bash
echo "Hello from ~/.local/bin"

저장 후 실행 권한을 줍니다.

chmod +x ~/.local/bin/hello-linux

아직 명령으로 인식되지 않는다면 PATH에 추가합니다.

export PATH="$HOME/.local/bin:$PATH"

그다음 실행합니다.

hello-linux

앞쪽에 추가한 이유는 셸이 왼쪽 경로부터 찾기 때문입니다. 하지만 이 점은 위험할 수도 있습니다. 예를 들어 내가 만든 ls라는 파일이 ~/.local/bin에 있고 이 경로가 /usr/bin보다 앞에 있으면, 원래의 ls가 아니라 내 파일이 실행될 수 있습니다. 명령이 어디서 실행되는지는 다음으로 확인합니다.

command -v ls
command -v hello-linux

PATH를 바꾼 뒤에는 command -v로 실제 실행 파일 위치를 확인하는 습관을 들이세요.

.bashrc, .bash_profile, .profile의 역할

지금까지 입력한 alias, 함수, export는 터미널을 닫으면 사라집니다. 계속 사용하려면 시작 스크립트에 적어야 합니다.

Bash에서 자주 만나는 파일은 세 가지입니다.

  • ~/.bashrc: 일반적인 대화형 터미널을 열 때 읽는 설정 파일입니다. 별칭, 함수, 프롬프트 설정을 주로 넣습니다.

  • ~/.bash_profile: 로그인 셸에서 읽는 Bash 전용 설정 파일입니다.

  • ~/.profile: 로그인 시 읽을 수 있는 비교적 범용적인 설정 파일입니다. Bash뿐 아니라 다른 셸에서도 쓰이는 경우가 있습니다.

Ubuntu 데스크톱이나 WSL에서 새 터미널을 열면 보통 ~/.bashrc가 적용됩니다. SSH로 로그인할 때는 로그인 셸로 시작하므로 ~/.profile 또는 ~/.bash_profile이 관여할 수 있습니다.

초보자에게 가장 단순한 기준은 다음과 같습니다.

  • alias, 함수, 프롬프트는 ~/.bashrc에 넣습니다.

  • 로그인 시 필요한 환경 변수는 ~/.profile에 넣을 수 있습니다.

  • ~/.bash_profile을 새로 만들었다면, ~/.profile이 자동으로 읽히지 않을 수 있으므로 주의합니다.

설정 파일을 고치기 전에는 백업을 만듭니다.

cp ~/.bashrc ~/.bashrc.bak.$(date +%Y%m%d-%H%M%S)

그다음 편집합니다.

nano ~/.bashrc

파일 맨 아래에 다음을 추가해 보세요.

alias ll='ls -alF'
alias dfh='df -h'

mkcd() {
  mkdir -p "$1" && cd "$1"
}

export PATH="$HOME/.local/bin:$PATH"

저장한 뒤 현재 터미널에 바로 적용하려면 다음을 실행합니다.

source ~/.bashrc

source는 파일 안의 명령을 현재 셸에서 실행합니다. 새 터미널을 열지 않고 설정을 반영할 때 사용합니다.

설정에 문법 오류가 있으면 터미널 시작이 불편해질 수 있습니다. 적용 전에는 다음처럼 문법만 검사할 수 있습니다.

bash -n ~/.bashrc

아무 출력이 없으면 Bash 문법 오류는 없다는 뜻입니다.

history, 치환, 와일드카드로 입력 줄이기

셸 환경을 바꾸는 일은 설정 파일만의 문제가 아닙니다. 입력 습관을 줄이는 기능도 생산성을 크게 높입니다.

이전에 입력한 명령은 history로 확인합니다.

history
history | tail -20

가장 유용한 기능은 Ctrl+R 검색입니다. 터미널에서 Ctrl+R을 누르고 기억나는 단어 일부를 입력하면 이전 명령을 거꾸로 검색합니다. 원하는 명령이 보이면 Enter로 실행하거나, 오른쪽 방향키를 눌러 편집한 뒤 실행할 수 있습니다.

기록 설정도 조정할 수 있습니다. ~/.bashrc에 다음을 넣으면 중복 기록을 줄이고, 기록 수를 늘릴 수 있습니다.

export HISTSIZE=5000
export HISTFILESIZE=10000
export HISTCONTROL=ignoredups:erasedups

명령 치환은 명령의 출력 결과를 다른 명령 안에 넣는 기능입니다.

echo "today is $(date +%F)"
cp report.txt "report-$(date +%F).txt"

예를 들어 백업 파일 이름에 날짜를 넣을 때 유용합니다.

변수 치환도 자주 사용합니다.

workdir="$HOME/linux-practice"
echo "$workdir"
cd "$workdir"

변수 이름 뒤에 문자가 바로 이어질 때는 {}를 쓰면 안전합니다.

name="log"
echo "${name}_backup"

와일드카드는 여러 파일 이름을 한 번에 지정할 때 씁니다.

ls *.log
ls file?.txt
ls report-[0-9].txt

중요한 점은 와일드카드를 명령어가 아니라 셸이 먼저 펼친다는 것입니다. 삭제나 이동에 쓰기 전에는 반드시 어떤 파일로 펼쳐지는지 확인합니다.

printf '%sn' *.log

확인 후에만 다음 단계로 갑니다.

mkdir -p old-logs
mv *.log old-logs/

rm *.log처럼 삭제와 와일드카드를 바로 결합하는 명령은 특히 조심합니다. 먼저 printf나 ls로 대상을 확인하세요.

프롬프트를 작업 정보판으로 바꾸기

프롬프트는 명령 입력 전 보이는 표시입니다. 기본 프롬프트도 충분하지만, 작업 위치와 사용자 정보를 더 잘 보이게 바꾸면 실수를 줄일 수 있습니다.

Bash의 프롬프트는 PS1 변수로 정합니다.

echo "$PS1"

자주 쓰는 표시 코드는 다음과 같습니다.

  • u: 사용자 이름

  • h: 호스트명

  • w: 현재 작업 디렉터리 전체 경로

  • W: 현재 디렉터리 이름만

  • $: 일반 사용자는 $, root는 # 표시

간단한 프롬프트는 다음처럼 만들 수 있습니다.

export PS1='u@h:w$ '

색을 넣으면 더 보기 쉽습니다.

export PS1='[e[32m]u@h[e[0m]:[e[34m]w[e[0m]$ '

여기서 [ ... ]는 색상 코드처럼 화면에 보이지 않는 문자를 Bash에게 알려 주는 표시입니다. 이것이 빠지면 긴 명령을 편집할 때 줄바꿈이 어긋날 수 있습니다.

Git 저장소에서 작업한다면 현재 브랜치를 프롬프트에 표시할 수도 있습니다. ~/.bashrc에 다음 함수를 추가합니다.

git_branch() {
  git branch --show-current 2>/dev/null | sed 's/.*/ (&)/'
}

export PS1='[e[32m]u@h[e[0m]:[e[34m]w[e[33m]$(git_branch)[e[0m]$ '

2>/dev/null은 Git 저장소가 아닌 디렉터리에서 생기는 오류 메시지를 숨깁니다. 프롬프트는 명령을 입력할 때마다 실행되므로 너무 무거운 명령을 넣으면 터미널 반응이 느려질 수 있습니다. 처음에는 간단하게 시작하고, 필요한 정보만 추가하는 것이 좋습니다.

실습 과제: 나만의 터미널 기본 세트 만들기

~/linux-practice/shell-env에서 다음 작업을 해 보세요.

mkdir -p ~/linux-practice/shell-env
cd ~/linux-practice/shell-env
  1. ~/.bashrc를 날짜가 포함된 이름으로 백업합니다.

  2. ll, dfh, duh 별칭을 추가합니다.

  3. mkcd 함수를 추가합니다.

  4. ~/.local/bin을 만들고 PATH에 추가합니다.

  5. bash -n ~/.bashrc로 문법 오류를 확인합니다.

  6. source ~/.bashrc로 적용합니다.

  7. type ll, type mkcd, command -v hello-linux로 결과를 확인합니다.

설정 파일을 고친 뒤 "적용했는지"보다 중요한 것은 "확인했는지"입니다. type, command -v, echo $PATH를 통해 셸이 실제로 무엇을 보고 있는지 읽어야 합니다.

문제 해결 시나리오: 설정 후 터미널이 이상해졌다

상황을 가정해 보겠습니다. ~/.bashrc를 수정한 뒤 새 터미널을 열었더니 오류 메시지가 나오거나 프롬프트가 깨져 보입니다.

먼저 문법 오류를 확인합니다.

bash -n ~/.bashrc

오류 줄 번호가 나오면 해당 줄 근처의 따옴표, 괄호, 중괄호를 확인합니다.

프롬프트 줄바꿈이 이상하면 색상 코드 주변에 [와 ]가 빠졌는지 봅니다.

별칭이나 함수가 예상과 다르게 동작하면 종류를 확인합니다.

type 명령이름

PATH 문제라면 실제 실행 위치를 확인합니다.

command -v 명령이름
echo "$PATH"

복구가 필요하면 백업 파일을 되돌립니다.

cp ~/.bashrc.bak.날짜 ~/.bashrc
source ~/.bashrc

백업 파일 이름은 실제로 만든 파일명으로 바꿔 입력합니다. 어떤 파일이 있는지 먼저 확인합니다.

ls -l ~/.bashrc.bak.*

셸 환경 설정의 목적은 화려한 터미널을 만드는 것이 아닙니다. 자주 하는 일을 줄이고, 실수하기 쉬운 정보를 눈앞에 두는 것입니다. 작은 별칭 하나, PATH 확인 습관 하나가 쌓이면 터미널은 가장 빠른 작업 공간이 됩니다.

책 목록

처음부터 실전까지, 터미널이 두렵지 않은 Linux 활용법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기