하루에 같은 명령을 수십 번 치는 관리자에게 셸은 단순한 입력기 이상이어야 한다. 그 첫 도구가 별칭이다.
alias는 명령이나 명령 묶음에 별명을 붙여, 자주 쓰는 옵션 조합을 외우지 않아도 되게 해준다.
alias # 등록된 모든 별칭 보기alias ll='ls -alF' # ll 입력 시 ls -alF 실행alias rm='rm -i' # rm을 항상 확인 모드로 (안전장치)alias ..='cd ..' # .. 입력으로 상위 디렉터리 이동alias grep='grep --color=auto' # grep 결과에 색상unalias ll # ll 별칭 제거unalias -a # 모든 별칭 제거
등록 위치가 중요하다. 명령행에서 직접 등록하면 현재 셸에서만, 로그아웃하면 사라진다.
영구적으로 쓰려면 ~/.bashrc에 적어 둬야 한다(.bashrc는 셸을 띄울 때마다 읽히므로).
# ~/.bashrc 에 추가하면 영구 적용echo "alias ll='ls -alF'" >> ~/.bashrcsource ~/.bashrc # 즉시 반영
별칭은 명령의 맨 앞 단어(명령 이름)에만 적용된다. alias ll='ls -l'을 등록해도 xll이나 echo ll에서는 확장되지 않는다. 셸은 명령 줄의 첫 단어가 별칭 목록에 있을 때만 치환한다.
⚠️ 함정: 별칭이 원래 명령을 가린 상황에서 원본 명령을 그대로 실행하려면 명령 앞에 백슬래시(\)를 붙인다. 예를 들어 alias rm='rm -i'가 걸려 있을 때 \rm file이라고 하면 확인 없이 원래 rm이 실행된다. command rm file이나 절대 경로 /bin/rm file도 같은 효과다. 별칭을 임시로 우회하는 표준 방법이다.
alias 기능은 1978년 빌 조이(Bill Joy)가 만든 C 셸에서 처음 등장했다. 이전의 본 셸에는 별칭이 없었다. 이 편의성이 큰 인기를 끌어 ksh, bash 등 후속 셸이 모두 채택했다. 그래서 "alias를 처음 도입한 셸은?"이라는 문제의 답은 csh다.
명령 이력은 메모리에 유지되다가 로그아웃 시 ~/.bash_history 파일에 저장된다.
history # 전체 명령 이력history 10 # 최근 10개history -c # 메모리의 이력 삭제(clear)!! # 바로 직전 명령 재실행!100 # 100번 명령 재실행!ls # 가장 최근의 ls로 시작한 명령 재실행!$ # 직전 명령의 마지막 인자sudo !! # 직전 명령을 sudo 붙여 재실행
!$(직전 명령의 마지막 인자)는 특히 자주 쓴다.
mkdir /opt/myapp/configcd !$ # cd /opt/myapp/config 과 동일
히스토리 동작은 환경 변수로 제어한다.
변수
의미
HISTSIZE
현재 세션 메모리에 보관할 명령 개수
HISTFILE
이력을 저장할 파일 경로 (보통 ~/.bash_history)
HISTFILESIZE
이력 파일에 저장할 최대 줄 수
HISTCONTROL
중복·공백 시작 명령 저장 제어 (ignoredups, ignorespace)
export HISTSIZE=5000export HISTCONTROL=ignoredups # 연속 중복 명령은 한 번만 저장
HISTCONTROL=ignorespace를 설정하면 공백으로 시작하는 명령은 이력에 남지 않는다. 비밀번호가 포함된 명령을 칠 때 줄 맨 앞에 공백 하나를 두면 history 파일에 기록되지 않아 보안에 유리하다. ignoreboth는 ignoredups와 ignorespace를 동시에 적용한다.
⚠️ 함정: history -c는 메모리상의 이력만 지운다. ~/.bash_history 파일은 그대로 남아, 다음 로그인 시 다시 불러와진다. 파일까지 비우려면 history -c && history -w(메모리 비운 뒤 파일에 덮어쓰기)를 하거나 > ~/.bash_history로 파일을 직접 비워야 한다. 또한 여러 터미널을 동시에 쓰면 마지막에 종료된 셸의 이력이 파일을 덮어쓸 수 있다.
Ctrl-Z는 작업을 종료가 아니라 일시 중지(SIGSTOP)한다. 멈춘 작업은 bg로 백그라운드에서 다시 굴리거나 fg로 포그라운드에 복귀시킬 수 있다. 반면 Ctrl-C는 작업에 SIGINT를 보내 종료시킨다. 둘을 혼동하지 말 것 — Z는 멈춤(suspend), C는 끝냄(terminate)이다.
%는 작업 번호를 가리키는 기호다. fg %1은 1번 작업을, fg %% 또는 fg는 가장 최근 작업을 뜻한다.
작업 번호 뒤의 +와 - 기호에도 의미가 있다. +는 현재 작업(current job) — fg나 bg를 인자 없이 쓸 때 대상이 되는 작업이고, -는 직전 작업(previous job)이다. jobs 출력에서 [1]+, [2]-처럼 표시된다.
./long_job.sh &disown %1 # 1번 작업을 jobs 목록에서 제거, SIGHUP 면역disown -h %1 # 작업은 유지하되 SIGHUP만 무시
방법
시점
특징
nohup cmd &
실행 시작 시
출력을 nohup.out에 기록, SIGHUP 무시
disown %n
실행 도중
이미 돌아가는 작업을 셸에서 분리
screen / tmux
세션 단위
터미널 세션 자체를 분리·재접속 (강력)
SIGHUP의 'HUP'은 hang up(전화를 끊다)에서 왔다. 유닉스 초창기에는 실제 전화 모뎀으로 터미널에 접속했는데, 전화를 끊으면(hang up) 연결된 모든 프로세스에 신호를 보내 정리하도록 한 것이 SIGHUP의 기원이다. 오늘날 SSH 세션이 끊길 때도 같은 신호가 전달되어, 돌리던 작업이 죽는 원인이 된다.
nohup cmd &에서 & 를 빼먹으면 명령이 포그라운드로 실행되어 셸이 그대로 묶인다. nohup은 "SIGHUP을 무시하라"는 의미일 뿐 "백그라운드로 보내라"는 뜻이 아니다. 백그라운드 실행은 어디까지나 &가 담당하므로, 둘을 함께 써야 "터미널 닫아도 백그라운드에서 계속" 동작이 완성된다.
명령 치환(command substitution)은 명령의 출력 결과를 다른 명령의 인자나 변수 값으로 쓰는 기능이다.
# $(...) 또는 `...` 두 표기TODAY=$(date +%Y%m%d)echo "백업 파일: backup_$TODAY.tar.gz"# 백업 파일: backup_20260605.tar.gz# 명령 결과를 바로 다른 명령의 인자로echo "커널 버전: $(uname -r)"kill $(pgrep -f myapp) # myapp 프로세스들을 한 번에 종료files=$(ls *.log) # 로그 파일 목록을 변수에cd $(dirname /opt/app/conf/x.ini) # /opt/app/conf 로 이동
명령 치환은 출력만 값으로 가져온다. 명령의 종료 코드(성공/실패)가 아니라 stdout에 찍힌 텍스트가 치환된다. 끝의 줄바꿈은 자동으로 제거된다. 그래서 count=$(ls | wc -l)처럼 개수를 깔끔한 숫자로 받을 수 있다.
산술 연산에는 비슷하게 생긴 $(( ... ))를 쓴다. 명령 치환 $( )와 구별해야 한다.
$( )(명령 치환)와 $(( ))(산술 확장)는 괄호 개수만 다르고 의미는 전혀 다르다. 하나짜리는 "명령을 실행해 출력으로 치환", 둘짜리는 "산술식을 계산해 결과로 치환"이다. 옛날에는 산술 연산도 expr 명령을 치환해 썼지만($(expr ...)), 외부 프로세스를 띄우므로 느리다. 셸 내장인 $(( ))가 더 빠르고 표준이다.