하루에 git status를 몇 번이나 칠까요. 세어 보면 30~50번은 됩니다. 한 번에 2초씩 잡아도 하루 100초, 한 달이면 40분이 넘습니다. 여기에 cd ~/projects/회사서비스/backend 같은 긴 경로 이동, docker compose -f docker-compose.dev.yml up -d처럼 옵션이 줄줄이 붙는 명령까지 더하면 더 커집니다. 오타로 다시 치는 시간은 뺀 계산입니다. 셸 alias 설정은 이 반복을 두세 글자로 줄이는 가장 값싼 방법입니다. 이번 글에서는 alias를 어디에 적어야 다음에도 살아 있는지, alias로는 안 되고 함수를 써야 하는 경우가 언제인지, PowerShell에서는 무엇이 다른지, 그리고 alias를 쓰다가 실제로 사고가 나는 지점까지 정리합니다.
먼저 1분만에 체감해 보기
설정 파일을 열기 전에, 지금 쓰는 터미널에 그냥 한 줄 쳐 보세요. 등호 양옆에 공백이 없어야 합니다. alias ll = 'ls -alh'처럼 띄우면 문법 오류가 납니다.
# 지금 셸에서 바로 시험해 봅니다 (창을 닫으면 사라집니다)
alias ll='ls -alh'
# 잘 동작하는지 확인
ll
# 이 정의가 어디서 왔는지 확인
type ll
# 출력: ll is aliased to `ls -alh`
이렇게 만든 alias는 지금 열려 있는 창에서만 삽니다. 터미널을 닫으면 사라집니다. 다음에도 쓰려면 셸이 시작할 때 읽는 파일에 적어 둬야 합니다.
어느 파일에 적어야 살아남나
여기서 헤매는 사람이 제일 많습니다. 셸마다 시작할 때 읽는 파일이 다르고, 같은 bash라도 로그인 셸이냐 아니냐에 따라 갈립니다.
| 환경 | 적을 파일 | 메모 |
|---|---|---|
| 리눅스 + bash | ~/.bashrc | 가장 일반적인 경우 |
| 맥 + zsh (카탈리나 이후 기본) | ~/.zshrc | 맥은 별다른 설정 없으면 여기 |
| 맥 + bash | ~/.bash_profile | 맥 터미널은 로그인 셸로 뜨므로 .bashrc를 안 읽습니다 |
| WSL (우분투 등) | ~/.bashrc | 윈도우 쪽 설정과 별개입니다 |
| Git Bash (윈도우) | ~/.bashrc | 없으면 새로 만들면 됩니다 |
| PowerShell | $PROFILE | 문법이 다릅니다 — 아래 별도 섹션 |
내가 지금 어떤 셸을 쓰는지 모르겠으면 echo $SHELL을 쳐 보세요. /bin/zsh면 ~/.zshrc, /bin/bash면 ~/.bashrc입니다. 맥에서 bash를 쓰면서 ~/.bashrc에 적었는데 반영이 안 되는 건 거의 항상 이 문제입니다 — 맥 터미널은 창을 열 때마다 로그인 셸로 시작해서 ~/.bash_profile만 읽기 때문입니다. ~/.bash_profile 안에 [ -f ~/.bashrc ] && . ~/.bashrc 한 줄을 넣어 두면 둘 다 읽히게 됩니다.
처음 넣어 둘 만한 것들
남의 설정 파일을 통째로 복사해 오면 대부분 안 씁니다. 내가 어제 실제로 친 명령 중에서 고르는 게 맞습니다. history | awk '{print $2}' | sort | uniq -c | sort -rn | head -20을 돌려 보면 내가 뭘 반복하는지 바로 나옵니다. 그걸 참고해서 다섯 줄쯤으로 시작하세요.
# ~/.bashrc 또는 ~/.zshrc 맨 아래에 추가
# --- 파일 목록 ---
alias ll='ls -alh'
alias lt='ls -alht' # 최근 수정순
# --- 이동 ---
alias ..='cd ..'
alias ...='cd ../..'
alias work='cd ~/projects/my-service'
# --- git ---
alias gs='git status -sb'
alias gd='git diff'
alias gl='git log --oneline --graph --decorate -20'
# --- 안전장치 ---
alias rm='rm -i' # 지우기 전에 한 번 물어봅니다
alias cp='cp -i'
저장했다고 바로 적용되지는 않습니다. 새 창을 열거나, 지금 창에 다시 읽히세요.
# 저장한 뒤 현재 창에 즉시 반영
source ~/.bashrc
# zsh를 쓴다면
source ~/.zshrc
rm -i 같은 안전장치는 취향이 갈립니다. 실수로 지우는 사고는 줄지만, 여러 파일을 지울 때 매번 물어봐서 귀찮고 무엇보다 “확인을 물어보는 게 기본”이라는 착각이 생깁니다. 다른 서버에 접속했을 때는 그 alias가 없어서 조용히 지워집니다. 습관이 위험해질 수 있다는 걸 알고 쓰세요.
alias로는 안 되는 것 — 인자가 필요할 때
alias는 단순 치환입니다. 입력한 단어를 정의된 문자열로 바꾸고 나머지 인자는 그 뒤에 그대로 붙입니다. 그래서 인자를 중간에 끼워 넣어야 하는 명령은 alias로 만들 수 없습니다. 이럴 땐 함수를 씁니다.
# 안 되는 방식 — 인자가 명령 뒤에 붙어 버립니다
alias mkcd='mkdir -p && cd' # mkcd myapp → mkdir -p && cd myapp
# 되는 방식 — 함수로 만들면 $1, $2 로 인자를 받습니다
mkcd() {
mkdir -p "$1" && cd "$1"
}
# 인자 전체를 넘겨야 하면 "$@"
gcm() {
git add -A && git commit -m "$@"
}
# 인자를 중간에 끼워 넣어야 하는 경우
serve() {
python -m http.server "${1:-8000}" # 인자 없으면 8000
}
함수도 alias와 똑같이 ~/.bashrc나 ~/.zshrc에 적어 두면 됩니다. 판단 기준은 간단합니다 — 인자가 맨 뒤에 붙어도 되면 alias, 중간에 들어가야 하거나 두 개 이상 쓰이면 함수입니다. 애매하면 그냥 함수로 만드세요. 함수는 alias가 할 수 있는 걸 전부 할 수 있습니다.
PowerShell은 규칙이 다릅니다
윈도우에서 PowerShell을 쓴다면 alias 명령 자체가 없고, 더 중요한 차이가 하나 있습니다. PowerShell의 Set-Alias는 옵션이나 인자를 포함할 수 없습니다. 명령 이름만 바꿔 부를 수 있을 뿐이라, git status -sb 같은 건 alias로 만들 수 없고 함수로 만들어야 합니다. 먼저 프로필 파일부터 준비합니다.
# 1) 내 프로필 파일 경로 확인
$PROFILE
# 2) 없으면 만들기
if (-not (Test-Path $PROFILE)) { New-Item -ItemType File -Path $PROFILE -Force }
# 3) 편집
notepad $PROFILE
그리고 이런 내용을 넣습니다.
# --- 인자가 필요 없으면 Set-Alias ---
Set-Alias ll Get-ChildItem
Set-Alias grep Select-String
# --- 옵션이 붙으면 반드시 function ---
function gs { git status -sb }
function gl { git log --oneline --graph --decorate -20 }
function work { Set-Location "D:\projects\my-service" }
# 인자 받기: $args 는 넘어온 인자 전부
function gcm { git add -A; git commit -m $args }
# 이름 있는 매개변수를 쓰면 더 읽기 좋습니다
function serve {
param([int]$Port = 8000)
python -m http.server $Port
}
프로필을 저장했는데 새 창에서 아무것도 적용이 안 된다면, 대개 실행 정책 때문입니다. 윈도우 클라이언트 기본값이 Restricted라 프로필 스크립트 자체가 로드되지 않습니다. 에러 메시지 없이 그냥 조용히 넘어가는 경우도 있어서 원인을 찾기 어렵습니다.
# 프로필이 무시된다면 실행 정책부터 확인
Get-ExecutionPolicy -List
# 현재 사용자에게만 허용 (관리자 권한 없이 실행됩니다)
Set-ExecutionPolicy -Scope CurrentUser RemoteSigned
한 가지 더. PowerShell에는 ls, cat, rm 같은 유닉스풍 이름이 이미 내장 alias로 등록돼 있습니다. 같은 이름으로 함수를 만들면 함수보다 alias가 우선하기 때문에 내 함수가 호출되지 않습니다. 이름이 겹치면 Remove-Item alias:ls로 기존 걸 먼저 치우거나, 아예 다른 이름을 쓰세요. 터미널 환경 자체를 손보는 이야기는 Windows Terminal 커스터마이징에 따로 정리해 뒀습니다.
Git은 자체 alias 기능이 있습니다
git 명령만큼은 셸 alias 대신 git 자체 기능을 쓰는 걸 권합니다. ~/.gitconfig에 저장되므로 bash·zsh·PowerShell·VS Code 터미널 어디서 쳐도 똑같이 동작하고, 셸 설정 파일을 옮기지 않아도 됩니다.
# ~/.gitconfig 에 기록되며, 어느 셸에서든 동작합니다
git config --global alias.st "status -sb"
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.last "log -1 HEAD --stat"
git config --global alias.lg "log --oneline --graph --decorate --all -20"
# 느낌표를 앞에 붙이면 셸 명령을 그대로 실행합니다
git config --global alias.undo "!git reset --soft HEAD~1"
# 등록된 것 전체 보기
git config --global --get-regexp "^alias\."
git undo처럼 느낌표로 시작하는 정의는 셸 명령을 그대로 실행합니다. 강력한 만큼 위험하기도 해서, reset --hard같이 되돌릴 수 없는 명령은 alias로 만들지 않는 편이 낫습니다. 두 글자로 줄어든 명령은 손이 먼저 움직이거든요. 커밋 관련해서는 Git 커밋 메시지 잘 쓰는 법도 참고하세요.
실제로 걸려 넘어지는 지점
- 스크립트 안에서는 alias가 동작하지 않습니다. bash는 대화형 셸에서만 alias를 확장합니다.
.sh파일에 alias를 쓰고 “왜 command not found가 나지” 하며 헤매기 쉬운 지점입니다. - alias는 명령의 첫 단어에만 적용됩니다.
alias g='git'을 만들어도sudo g status는 동작하지 않습니다.sudo뒤의 단어는 확장 대상이 아니기 때문입니다. 필요하면alias sudo='sudo '처럼 끝에 공백을 하나 넣어 두세요 — 이러면 다음 단어도 확장됩니다. - 이름이 기존 명령과 겹치면 조용히 덮어씁니다. 새 alias를 만들기 전에
type 이름(bash/zsh) 또는Get-Command 이름(PowerShell)으로 이미 뭔가 있는지 확인하세요.test,which,ls같은 이름을 잘못 덮으면 다른 스크립트가 깨집니다. - 원격 서버에는 내 alias가 없습니다. SSH로 접속한 서버, 도커 컨테이너 안, CI 환경은 전부 남의 셸입니다. 여기서도 손이 알아서
gs를 치게 되는데 당연히 안 먹습니다. 서버에서 돌릴 절차를 문서에 적을 때는 반드시 원래 명령으로 적으세요. - 따옴표 안쪽에 또 따옴표가 필요할 때. 작은따옴표로 감싼 alias 안에는 작은따옴표를 넣을 수 없습니다. 이 경우는 억지로 이스케이프하지 말고 함수로 바꾸는 게 훨씬 깔끔합니다.
#!/bin/bash
alias ll='ls -alh'
ll # 스크립트에서는 동작하지 않습니다
# 굳이 스크립트 안에서 쓰려면 확장을 켜야 합니다
#!/bin/bash
shopt -s expand_aliases
alias ll='ls -alh'
ll # 이제 동작합니다
반대로, alias를 잠깐 무시하고 원래 명령을 쓰고 싶을 때도 방법이 있습니다.
# alias 를 잠깐 무시하고 원래 명령을 쓰는 세 가지 방법
command rm old.log # alias/함수를 건너뜁니다
\rm old.log # 역슬래시를 붙여도 같은 효과
unalias rm # 이번 세션에서 아예 해제
# PowerShell 에서는
Remove-Item alias:ll # 현재 세션에서만 해제
여러 대에서 같은 설정 쓰기
노트북과 회사 데스크톱을 오간다면, alias를 ~/.bashrc 본문에 섞어 두지 말고 별도 파일로 빼 두는 게 낫습니다. 설정 파일 전체를 옮기면 그 기계에만 해당하는 경로나 환경변수까지 따라가서 문제가 생기지만, alias 파일 하나만 복사하면 부작용이 없습니다.
# ~/.my_aliases 라는 파일 하나에 몰아 둡니다
alias ll='ls -alh'
alias gs='git status -sb'
# 그리고 ~/.bashrc (또는 ~/.zshrc) 에는 이 두 줄만
if [ -f ~/.my_aliases ]; then
. ~/.my_aliases
fi
이제 ~/.my_aliases 하나만 깃허브 비공개 저장소나 클라우드 드라이브에 두고 기계마다 받아 쓰면 됩니다. 처음부터 거창하게 dotfiles 관리 도구를 도입할 필요는 없습니다. 파일 하나로 시작해서 부족해질 때 넘어가도 늦지 않습니다.
어디까지 줄일지
alias를 만들다 보면 재미가 붙어서 30개, 50개까지 늘리게 되는데, 여기에는 분명한 비용이 있습니다.
| 기준 | 만들 만함 | 안 만드는 게 나음 |
|---|---|---|
| 사용 빈도 | 하루 5회 이상 | 한 달에 몇 번 |
| 길이 | 옵션이 붙어 길다 | 원래 짧다 (cd, pwd) |
| 위험도 | 읽기 전용 명령 | 삭제·강제 푸시 등 되돌릴 수 없는 명령 |
| 기억 가능성 | 명령의 앞글자 (gs=git status) | 의미 없는 축약 |
개수보다 중요한 건 손이 기억하는 것만 남기는 것입니다. 한 달에 한 번 쓰는 alias는 정작 필요할 때 이름이 기억나지 않아서 결국 원래 명령을 칩니다. 두 달쯤 지나면 설정 파일을 한 번 열어서 안 쓰는 줄을 지우세요. 명령 자체를 더 빠르게 만드는 도구들은 터미널 생산성 도구 7가지에 정리해 뒀습니다.
마무리
오늘 딱 세 줄만 넣어 보세요. ll, gs, 그리고 제일 자주 들어가는 프로젝트 폴더로 가는 work. 이 세 개가 손에 붙는 데 이틀이면 충분하고, 그다음부터는 “이거 매번 치기 귀찮은데”라는 생각이 들 때마다 한 줄씩 늘어납니다. 처음부터 남의 설정 파일을 통째로 가져오는 것보다 이 순서가 훨씬 오래갑니다.
다음 글에서는 AI로 SQL 쿼리를 작성하고 검증하는 방법을 다룹니다. AI가 만들어 준 쿼리를 그대로 실행하기 전에 무엇을 확인해야 하는지, 검증 절차까지 이어서 정리하겠습니다.