삶을 더 편하게 만드는 Shell 트릭
(blog.hofstede.it)- 다양한 키보드 단축키와 명령 조합을 활용해 셸 환경에서 작업 속도와 효율을 높이는 방법 정리
- CTRL + W, U, K, Y 등 기본 단축키로 줄 편집, CTRL + A/E, ALT + B/F로 커서 이동, reset으로 터미널 복구 가능
- Bash와 Zsh에서는 CTRL + R로 명령 히스토리 검색, !!·!$·ESC+. 등으로 이전 명령 재활용, Brace Expansion과 Globstar로 반복 작업 자동화
- Process Substitution, tee, bg/disown 등 고급 기능으로 프로세스 제어와 로그 관리 효율화
- 셸을 도구 상자처럼 익숙하게 다루면 생산성과 집중력을 높일 수 있으며, 단축키를 하나씩 습관화하는 것이 핵심임
거의 모든 셸에서 작동하는 기본 단축키와 기능
-
CTRL + W, U, K, Y조합은 커서 기준으로 단어 또는 줄의 앞뒤를 빠르게 삭제하거나 복원하는라인 편집 단축키
-
CTRL + W는 커서 앞의 단어 삭제 -
CTRL + U는 커서부터 줄의 시작까지 잘라내기,CTRL + Y로 다시 붙여넣기 가능 -
CTRL + K는 커서부터 줄 끝까지 잘라내기 - CTRL + A / E는 줄의 처음과 끝으로 이동, ALT + B / F는 단어 단위로 앞뒤 이동
- 대부분의 터미널에서 기본 활성화되어 있으며, Mac에서는 Option 키를 Meta로 설정해야 작동
- reset 또는 stty sane 명령은 바이너리 파일을 잘못 출력해 터미널이 깨졌을 때 복구
- 화면이 깨져도 입력은 가능하므로
reset입력 후 엔터로 복원 - CTRL + C / D는 각각 명령 중단과 EOF(파일 끝) 신호 전송
-
CTRL + D는 빈 프롬프트에서 누르면 셸 종료 -
CTRL + L은
clear명령과 동일하게 화면을 즉시 정리 - 현재 입력 중인 명령을 유지한 채 프롬프트를 화면 상단으로 이동
- cd - 는 이전 디렉터리로 즉시 이동, pushd / popd는 디렉터리 스택을 이용해 여러 위치를 오가며 작업 가능
- > file.txt는 파일을 비우되 삭제하지 않아 권한과 소유권을 유지
- $_ 변수는 이전 명령의 마지막 인자를 재사용
- 예:
mkdir -p /path/newdir && cd "$_" - set -e, set -u는 스크립트 안전성을 높이는 옵션
-
set -e는 오류 발생 시 즉시 종료 -
set -u는 정의되지 않은 변수를 참조할 경우 오류 처리 -
set -euo pipefail조합은 보다 강력한 보호 기능 제공
-
Bash와 Zsh에서의 고급 단축키 및 기능
-
CTRL + R은 명령어 히스토리에서 역방향 증분 검색 수행
- 키워드 입력 시 과거 명령을 즉시 찾아 재사용 가능
-
!! 는 이전 명령 전체를 재실행
-
sudo !!로 직전 명령을 관리자 권한으로 재실행 가능
-
-
CTRL + X, CTRL + E는 현재 입력 중인 명령을 기본 편집기(Vim, Nano 등) 에서 열어 수정 후 실행
- Zsh에서는 별도 설정 필요
-
fc 명령은 이전 명령을
$EDITOR로 열어 수정하는 전통적 방식
-
ESC + . 또는 ALT + . 은 직전 명령의 마지막 인자를 커서 위치에 삽입
- 반복 입력 시 더 이전 명령의 인자까지 순환
- !$ 는 같은 기능을 비대화식으로 수행
-
Brace Expansion은 반복 입력을 줄이는중괄호 확장 기능
-
cp pf.conf{,.bak}→cp pf.conf pf.conf.bak -
mv filename.{txt,md}→mv filename.txt filename.md -
mkdir -p project/{src,tests,docs}로 여러 디렉터리 생성 -
Process Substitution
<(command)은 명령 출력을 파일처럼 다룸 - 예:
diff <(sort file1.txt) <(sort file2.txt)로 임시 파일 없이 비교 - **Globstar(
**)**는 하위 디렉터리까지 재귀적으로 파일 탐색 - Bash에서는
shopt -s globstar로 활성화, Zsh에서는 기본 활성화 - 예:
ls **/*.js로 모든 하위 폴더의 JS 파일 탐색
-
-
CTRL + Z**,** bg**,** disown조합은 프로세스를백그라운드 실행 및 셸 분리
-
CTRL + Z로 일시 중단 →bg로 백그라운드 실행 →disown으로 셸과 분리 - SSH 종료 후에도 프로세스 유지 가능
- command |& tee file.log는 표준 출력(stdout) 과 표준 오류(stderr) 를 동시에 파이프로 전달
-
|&는2>&1 |의 축약형 -
tee를 사용해 화면 출력과 로그 저장을 동시에 수행
-
셸 활용의 핵심 조언
- 셸은 도구 상자이며, 익숙하게 다루면 생산성을 크게 높일 수 있음
- 모든 단축키를 한 번에 익히기보다 하나씩 습관화하는 것이 효과적
- 반복적인 입력과 불필요한 타이핑을 줄여 작업 흐름을 단순화할 수 있음
- 익숙해지면 터미널은 더 이상 장애물이 아니라 자신의 작업 공간이 됨
Hacker News 의견들
-
내가 인생이 바뀌었다고 느낀 건 위쪽 화살표 키를 리맵핑한 순간이었음
이제는 모든 명령어를 순회하지 않고, 이미 입력한 문자로 시작하는 명령어만 탐색함
예를 들어tar -입력 후 위쪽 화살표를 누르면 이전에 사용한 tar 옵션이 바로 나옴
zsh에서는 다음처럼 설정함bindkey "^[OA" up-line-or-beginning-search # Up bindkey "^[OB" down-line-or-beginning-search # Down- CTRL+r을 쓰기 시작하면 위쪽 화살표를 다시는 안 쓰게 됨
- 완전한 게임 체인저라고 생각함. bash에서도 비슷하게 하려면
.inputrc에 다음을 추가함"\e[A":history-search-backward "\e[B":history-search-forward - fish shell에서는 이게 기본 동작임. 입력한 단어를 기준으로 위/아래 화살표로 명령어를 탐색하고, alt+위/아래로 인자만 탐색할 수도 있음
-
.inputrc에서도 동일하게 구현 가능함 - 나는 위/아래 화살표는 그대로 두고, 대신 ctrl+p와 ctrl+n을 이 방식으로 설정함
-
터미널에서 vim-mode를 켜면 훨씬 편안해짐
세 단어 전에서 실수했을 때?3bcw면 끝임
전체 삭제는cc, 복잡한 수정은v로 (neo)vim에서 바로 열 수 있음
이미 (neo)vim을 쓰고 있다면 새로운 단축키를 외울 필요가 없어서 최고임- 예전 Emacs 매뉴얼의 한 구절이 떠오름. 복잡한 명령 대신 마우스 설정을 추천하고 싶음
- 20년 넘게 (n)vim을 써왔지만 shell의 vi-mode는 싫음. 복잡한 명령이 필요할 땐
ctrl-x+e로 neovim에서 열어 쓰는 게 좋은 절충안임 - 나도 vim을 자주 쓰지만 shell에서는 안 씀. 대신 Emacs 스타일 단축키(ctrl-a, ctrl-e 등)를 macOS 전역에서 사용함. vim이 insert 모드에서 emacs 바인딩을 지원했으면 좋겠다고 생각함
- “readline vi-mode”라는 기능 이름을 처음 알게 됨. 더 찾아봐야겠음
- 왜 emacs 모드가 기본인지 이해가 안 됨. 새 shell을 열면 제일 먼저
set -o vi를 입력함
-
어떤 사람이
\#라는 스크립트를 PATH에 넣어서 파이프라인 일부를 주석 처리할 수 있게 했다는 게 인상 깊었음#!/bin/sh cat- 나도 비슷한 트릭을 씀.
~/bin/noglob파일에
이렇게 해서 bash에서 zsh 스크립트를 호출할 때 noglob 충돌을 피함#!/bin/sh $* - 나는 괄호 주석을 씀. 스크립트 문서화에는 좋지만 인터랙티브 쉘에서는 번거로움. 그래도 창의적인 주석 방식이라 재미있음
-
mycmd1 #| mycmd2와 비교했을 때 어떤 장점이 있는지 궁금함 - 이건 정말 유용해서 내
$PATH에 추가할 예정임
- 나도 비슷한 트릭을 씀.
-
CTRL+W는 보통 이전 공백까지 삭제하므로
/var/log/nginx/전체를 지움
Alt+Backspace는 비알파벳 문자 전까지 삭제함
단, 브라우저 탭을 닫는 단축키와 겹치니 주의해야 함 -
자주 쓰는 트릭 하나 있음
긴 명령을 입력하다가 다른 걸 먼저 해야 할 때,Ctrl-C로 취소하지 않고 주석 처리 후 실행해서 히스토리에 남김$ long_command $ #long_command $ stuff_1 $ stuff_2 $ #long_command $ long_command- zsh에서는
"push-line-or-edit"바인딩으로 가능하고, bash에서는C-u후C-y로 비슷하게 구현 가능함 - 더 쉬운 방법은
ctrl-u로 현재 줄을 저장하고 비운 뒤,ctrl-y로 다시 붙이는 것임. zsh에서는alt-q로 이 과정을 자동화할 수 있음 - bash에서는
alt-shift-3으로 현재 명령 앞에#을 붙이고 새 줄로 이동할 수 있음
- zsh에서는
-
LLM풍 제목은 별로지만, 몇몇 팁은 유용해서 시도해볼 예정임
brace expansion이 탭 완성과 잘 안 맞는 게 아쉬움. 마지막 토큰 복제나 파일 확장자 삭제 같은 기능이 더 있었으면 좋겠음- 글의 문체 자체도 LLM 느낌이 남. 예를 들어 “The shell is a toolbox, not an obstacle course.” 같은 문장
- PowerShell에도 readline 모드가 있어서 WSL과 병행할 때 전환 부담이 줄어듦
- readline은 bash의 일부처럼 작동하므로, 이런 팁들을 shell 기능이라 불러도 무방하다고 생각함
-
zsh 설정에서 특정 명령을 히스토리에서 제외하는 함수를 씀
예를 들어--force같은 위험한 명령이 히스토리에 남지 않게 함function zshaddhistory() { emulate -L zsh if ! [[ "$1" =~ "(^ |--force|whatever)" ]] ; then print -sr -- "${1%%$'\n'}" fc -p else return 1 fi }- 나도 비슷하게, 기록하지 않을 명령에 공백을 앞에 붙이는 alias를 만들어둠
unhist () { alias $1=" $1"; } unhist unhist unhist fzf unhist rghist
- 나도 비슷하게, 기록하지 않을 명령에 공백을 앞에 붙이는 alias를 만들어둠
-
zsh에서 글로벌 alias 자동 확장을 구현한 스니펫을 씀
예를 들어alias -G G='rg -s'로 설정하면,command | G입력 시 자동으로command | rg -s로 확장됨
space 입력 시 자동으로 확장되며,\alias로 입력하면 확장을 건너뜀 -
.bashrc에 만든 “deep cd” 함수가 있음
인자로 받은 문자열을 포함하는 첫 번째 디렉터리로 자동 이동함dcd() { [ -z "$1" ] && return local dir dir=$(find . -type d -path "*$1*" -print -quit 2>/dev/null) [ -n "$dir" ] && cd "$dir" }처음엔 느릴 줄 알았는데 의외로 자주 쓰게 됨
- autojump의
jc나 z, fzf 같은 스마트 cd 도구도 함께 살펴보면 좋음
- autojump의