반응형

바쁜 분은 이것만

  1. ~/.zshrc에 alias ll='ls -alh'처럼 적고 source ~/.zshrc
  2. 안에 $가 있으면 작은따옴표로 감싸야 쓸 때마다 다시 계산돼요
  3. 인자(포트 번호, 폴더 이름)가 필요하면 alias 말고 함수로

터미널에서 source .venv/bin/activate, lsof -nP -iTCP:8000 -sTCP:LISTEN 같은 긴 명령을 하루에도 몇 번씩 치게 돼요. 이런 건 짧은 이름을 붙여 두면 편합니다. 맥은 macOS Catalina부터 기본 셸이 zsh라서(Apple 지원 문서 기준), 설정은 홈 폴더의 ~/.zshrc 파일에 적어요. 터미널을 새로 열 때마다 이 파일을 읽습니다.

1. 이번에 쓸 .zshrc 예시

아래 내용을 ~/.zshrc 맨 아래에 붙이면 돼요. 파일이 없으면 새로 만들어도 됩니다. 고치기 전에 cp ~/.zshrc ~/.zshrc.bak으로 사본을 하나 두면 마음이 편해요.

# 1) alias: 짧은 이름 = 긴 명령
alias ll='ls -alh'
alias ..='cd ..'
alias py='python3'
alias venv='source .venv/bin/activate'

# 2) 따옴표: 안에 $가 있으면 작은따옴표로 (실행할 때 펼쳐짐)
alias now='date "+%Y-%m-%d %H:%M:%S"'
alias here_single='echo $PWD'
alias here_double="echo $PWD"

# 3) 인자가 필요하면 함수
mkday() {
  local d=$(date +%Y-%m-%d)
  mkdir -p "$d${1:+_$1}" && cd "$d${1:+_$1}" && pwd
}

port() {
  if [ -z "$1" ]; then
    echo "사용법: port 포트번호"; return 1
  fi
  lsof -nP -iTCP:"$1" -sTCP:LISTEN
}
  • alias는 alias 이름='명령' 형식이고 등호 양옆에 띄어쓰기가 있으면 안 돼요.
  • here_double은 따옴표 차이를 보려고 일부러 넣은 잘못된 예입니다.

2. 진짜 설정을 건드리지 않고 시험해 보기

이 글의 출력은 제 ~/.zshrc를 고치지 않고 만들었어요. zsh는 ZDOTDIR 환경 변수가 있으면 홈 대신 그 폴더의 .zshrc를 읽기 때문에, 임시 폴더에 위 파일을 넣고 그 폴더로 zsh를 띄우면 됩니다.

T=$(mktemp -d)
cp zshrc_sample $T/.zshrc
ZDOTDIR=$T zsh -i -c 'alias ll; type ll'
rm -rf $T
ll='ls -alh'
ll is an alias for ls -alh

새 alias를 써 보고 싶을 때 이렇게 먼저 확인하면, 실수가 있어도 평소 터미널은 멀쩡해요.

3. alias 목록 보기, 따옴표 차이

그냥 alias만 치면 전체 목록, alias 이름은 하나만 보여 줘요. type은 그 이름이 alias인지 함수인지 알려 줍니다.

## alias 목록
here_double='echo <임시폴더>/work'
here_single='echo $PWD'
ll='ls -alh'
now='date "+%Y-%m-%d %H:%M:%S"'
py=python3
venv='source .venv/bin/activate'
## alias ll 하나만
ll='ls -alh'
## type
ll is an alias for ls -alh
mkday is a shell function from <임시폴더>/.zshrc
## now
2026-11-03 00:16:48

(목록은 alias | grep으로 이 글에서 만든 것만 골랐어요. py=python3처럼 띄어쓰기가 없는 건 따옴표 없이 보여 줍니다.)

여기서 here_double을 보세요. 큰따옴표로 감싸서 .zshrc를 읽는 순간의 $PWD가 박혀 버렸어요. /tmp로 옮겨 두 개를 실행하면 차이가 확실합니다.

## 따옴표 차이 (/tmp로 이동 후)
/tmp
<임시폴더>/work

작은따옴표 쪽(here_single)은 실행할 때 $PWD를 계산해 지금 위치 /tmp가 나오고, 큰따옴표 쪽은 예전 위치가 그대로 나와요. $나 $(...)가 들어간 alias는 작은따옴표로 감싸세요. 안쪽에 큰따옴표가 필요하면 now처럼 바깥 작은따옴표 + 안쪽 큰따옴표로 쓰면 됩니다.

4. 인자가 필요하면 함수

zsh alias는 단어를 바꿔 끼우는 것이라 "중간에 값 넣기"가 안 돼요. 포트 번호나 폴더 이름을 받으려면 함수로 만들고 $1, $2로 받습니다. 아래는 임시 ZDOTDIR의 zsh에 한 줄씩 넣어 돌린 출력이에요(python -m http.server 8000을 미리 띄워 둠).

① venv 켜기 — 프로젝트 폴더에서 venv 한 단어로 가상환경을 켭니다.

$ which python3
/opt/homebrew/bin/python3
$ venv
(.venv) $ which python3
<임시폴더>/work/.venv/bin/python3

② 오늘 날짜 폴더 만들고 들어가기 — ${1:+_$1}은 "인자가 있으면 _인자, 없으면 빈칸"이라는 뜻이에요.

$ mkday
<임시폴더>/work/2026-11-03
$ cd ..
$ mkday 회의
<임시폴더>/work/2026-11-03_회의
$ cd ..
$ ls
2026-11-03
2026-11-03_회의

③ 포트 쓰는 프로세스 찾기 — "Address already in use"가 뜰 때 누가 그 포트를 잡고 있는지 봐요. -n -P는 이름 풀이를 안 해서 빨리 나오게, -sTCP:LISTEN은 듣고 있는 쪽만 보여 줍니다. 짧게 lsof -i :8000로 쳐도 돼요.

$ port 8000
COMMAND  PID         USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
Python  9279 me    3u  IPv4 0xbc755a11eec1a8dd      0t0  TCP 127.0.0.1:8000 (LISTEN)
$ port
사용법: port 포트번호
$ echo "종료 코드: $?"
종료 코드: 1

PID(9279)가 나오니 필요하면 kill 9279로 끄면 됩니다. 인자가 없을 때 안내를 보여 주고 return 1로 끝내게 해 두면 실수했을 때 알아보기 쉬워요.

5. 해제(unalias)와 다시 읽기(source)

$ unalias ll
$ ll
zsh: command not found: ll
$ source $ZDOTDIR/.zshrc
$ alias ll
ll='ls -alh'
  • unalias는 지금 열린 터미널에서만 지워요. 영원히 없애려면 ~/.zshrc에서 그 줄을 지우세요.
  • ~/.zshrc를 고친 뒤 열려 있는 터미널에 반영하려면 source ~/.zshrc, 아니면 새 창을 열면 됩니다. (위 테스트에선 임시 파일이라 source $ZDOTDIR/.zshrc로 읽었어요. 평소엔 ~/.zshrc.)

한 가지 주의할 점: 처음엔 zsh -i -c '...'에 명령을 한꺼번에 넘겨 테스트했는데, unalias 뒤인데도 ll이 그대로 ls -alh로 실행됐어요. 줄을 나눠도 같았습니다.

$ ZDOTDIR=$T zsh -i -c 'unalias ll; ll -d .'
drwx------@ 3 me  staff    96B Nov  3 00:19 .
$ ZDOTDIR=$T zsh -i -c 'unalias ll
ll -d .'
drwx------@ 3 me  staff    96B Nov  3 00:19 .

alias는 명령을 읽어 들이는 시점에 펼쳐지는데, -c 문자열은 실행 전에 통째로 읽히기 때문으로 보여요. 그래서 위 4·5절 출력은 명령을 한 줄씩 넣는 방식으로 만들었고, 터미널에 직접 한 줄씩 칠 때는 생기지 않는 일입니다. 스크립트 안에서 alias에 기대지 말고 함수를 쓰는 편이 안전한 이유이기도 해요.

원래 명령을 같은 이름의 alias로 덮었을 때(alias ls='ls -G') alias를 건너뛰려면 앞에 \나 command를 붙여요.

$ alias ls='ls -G'
$ type ls
ls is an alias for ls -G
$ \ls -d .venv
.venv
$ command ls -d .venv
.venv

정리

하고 싶은 것 명령
짧은 이름 붙이기 alias ll='ls -alh' (등호 옆 띄어쓰기 X)
$ 들어간 alias 작은따옴표 'echo $PWD'
목록 / 하나 보기 / 종류 alias / alias ll / type ll
지금 창에서 해제 unalias ll
인자 받기 함수 port() { lsof -nP -iTCP:"$1" -sTCP:LISTEN; }
고친 뒤 반영 source ~/.zshrc 또는 새 창
alias 건너뛰기 \ls 또는 command ls
설정 안 건드리고 시험 ZDOTDIR=임시폴더 zsh -i

참고: Apple 지원 — Mac에서 zsh를 기본 셸로 사용하기 / zsh 공식 문서 — Aliasing, Functions, Startup Files(ZDOTDIR) / lsof(8) man page

반응형

+ Recent posts