자주 쓰는 명령어를 별칭(alias)·함수로 만들어 두기

하루에 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가 만들어 준 쿼리를 그대로 실행하기 전에 무엇을 확인해야 하는지, 검증 절차까지 이어서 정리하겠습니다.

댓글 남기기