거의 모든 POSIX 계열 셸에서 통하는 기본 단축키부터 Bash와 Zsh의 강력한 기능까지, 터미널 작업을 더 빠르고 덜 고통스럽게 만들어 주는 실용적인 셸 요령들을 소개합니다.
줄 맨 앞의 오타를 고치려고, 그 외에는 아주 뛰어난 엔지니어가 Backspace 키를 6초 내내 누르고 있는 모습을 보는 데에는 유독 생생하고 본능적인 종류의 고통이 있습니다.
우리 모두 그런 적이 있습니다. 우리는 ls, cd, 그리고 grep을 배우고는, 대충… 거기서 멈춥니다. 터미널은 우리가 살아가는 공간이 되지만, 그 안의 가구를 배치하려는 수고는 좀처럼 하지 않습니다. 어떤 작업은 40번의 키 입력이 드는 게 당연하다고 받아들이면서도, 셸 작성자들이 바로 그 불편함을 1989년쯤 이미 해결해 두었다는 사실은 전혀 모른 채 지나갑니다.
여기 소개하는 것들은 완전히 비밀스러운 요령은 아니지만, 그렇다고 늘 가르쳐 주는 것도 아닙니다. 우리의 넓디넓은 Unix 가족의 평화를 위해, 이것들을 두 진영으로 나눠 보겠습니다. 거의 모든 POSIX 계열 셸에서 통하는 보편적인 요령들(FreeBSD의 sh나 OpenBSD의 ksh 같은 것들)과, Bash나 Zsh 같은 대화형 셸에 특화된 삶의 질 향상 기능들입니다.
이 요령들은 표준 터미널 라인 규약, 일반적인 Bourne 셸 동작, 또는 POSIX 기능에 기대고 있습니다. 2009년산 임베디드 라우터에 SSH로 접속하든, 막 설치한 OpenBSD 박스를 다루든, 최소한의 Alpine 컨테이너에 들어가든, 이 기능들은 여전히 든든한 지원군이 되어 줍니다.
한 글자씩 뒤로 지울 필요가 뭐 있겠습니까? 순간이동하면 되는데요. 이것들은 표준 Emacs 스타일의 줄 편집 바인딩이며(Readline 또는 유사 기능을 통해), 대부분의 현대적인 셸에서 기본으로 활성화되어 있습니다.
CTRL + W: /var/log/nginx/를 입력 중이었는데 사실은 /var/log/apache2/를 의도했다고 합시다. 선택지는 둘입니다. 영혼이 육체를 떠날 때까지 Backspace를 누르고 있거나, CTRL + W를 눌러 커서 앞의 단어를 즉시 지우는 것입니다. 한 번 익숙해지면 Backspace를 누르고 있는 행위는 숟가락으로 구덩이를 파는 것처럼 느껴집니다.
CTRL + U 와 CTRL + K: 정교하게 잘 만든 80자짜리 rsync 명령을 다 입력했는데, 갑자기 먼저 목적지 디렉터리가 실제로 존재하는지 확인해야 한다는 사실이 떠오릅니다. 지우고 싶지는 않지만, 그렇다고 실행하고 싶지도 않습니다. CTRL + U를 누르면 커서 위치부터 줄 시작까지 전부 잘라냅니다. 디렉터리를 확인한 다음, **CTRL + Y**를 눌러 당신의 걸작을 다시 프롬프트에 붙여 넣으세요(“yank”). (CTRL + K는 같은 방식이지만, 커서 위치부터 줄의 끝 까지를 잘라냅니다.)
CTRL + A 와 CTRL + E: 줄의 시작(A)이나 끝(E)으로 즉시 이동합니다. Home 키와 End 키를 찾으려고 손을 뻗는 습관은 이제 버리세요. 어차피 홈 로우에서 너무 멀리 떨어져 있습니다.
ALT + B 와 ALT + F: 한 번에 한 단어씩 뒤로(B) 또는 앞으로(F) 이동합니다. 화살표 키의 훨씬 빠르고, 훨씬 멋진 형제라고 할 수 있습니다. (Mac 사용자: 보통 이것이 작동하려면 Option 키를 Meta로 쓰도록 터미널 설정을 조정해야 합니다.)
reset (또는 stty sane): 엄밀히 말하면 대화형 셸 요령이라기보다 터미널 복구 팁에 더 가깝지만, 여기 들어갈 자격이 충분합니다. 우리 모두 해 본 적이 있습니다. 텍스트 파일을 cat하려던 것이었는데, 실수로 컴파일된 바이너리나 압축된 tarball을 cat해 버린 것입니다. 갑자기 터미널은 고대의 룬 문자와 Wingdings 같은 것을 토해 내고, 프롬프트는 완전히 읽을 수 없게 됩니다. 부끄러운 마음으로 터미널 창을 닫는 대신, reset을 입력하고(입력한 글자가 보이지 않더라도) 엔터를 누르세요. 터미널이 스스로 회복합니다.
CTRL + C: 현재 명령을 즉시 취소합니다. 명령이 멈춰 버렸거나, 잘못된 로그 파일을 tail하고 있다는 걸 깨달았을 때의 비상 탈출구입니다.
CTRL + D: EOF(End of File) 신호를 보냅니다. 입력을 기대하는 명령에 무언가를 타이핑하고 있었다면, 이것이 입력 스트림을 닫습니다. 하지만 명령줄이 비어 있다면 셸에서 완전히 로그아웃되므로, 어디서 누르는지 조심해야 합니다.
CTRL + L: 터미널이 스택 트레이스, 컴파일러가 쏟아낸 스파게티, 그리고 순수한 디지털 잡음으로 뒤덮여 있다고 합시다. clear 명령을 실행해도 되지만, 이미 새 명령을 반쯤 입력한 상태라면 어떨까요? CTRL + L은 생각의 흐름을 끊지 않은 채 화면을 깨끗이 비우고, 현재 프롬프트를 맨 위로 올려 줍니다.
cd -: 고전적인 채널 전환 버튼입니다. /usr/local/etc/postfix 깊숙한 곳에 있다가 /var/log에서 뭔가를 확인해야 한다고 합시다. cd /var/log를 입력해 로그를 살펴본 뒤, 다시 돌아가고 싶습니다. 그 긴 경로를 다시 타이핑하는 대신 cd -를 입력하세요. 이전 디렉터리로 전환됩니다. 한 번 더 실행하면 다시 로그 디렉터리로 돌아갑니다. 왔다 갔다 하기에 완벽합니다.
pushd 와 popd: cd -가 토글 스위치라면, pushd는 스택입니다. 여러 디렉터리를 번갈아 다뤄야 하나요? pushd /etc는 /etc로 이동하면서 이전 디렉터리를 숨겨진 스택에 저장합니다. 끝났다면 popd를 입력해 스택에서 꺼내고, 정확히 떠나온 위치로 돌아가세요.
> file.txt: 파일을 삭제했다가 다시 만들지 않고도, 내용을 완전히 비웁니다. 이게 왜 중요할까요? 파일 권한과 소유권이 유지되고, 이미 그 파일을 열고 있는 프로세스도 끊기지 않습니다. echo "" > file.txt보다 훨씬 깔끔합니다(이 방법은 실제로는 개행 문자 하나를 남깁니다). rm file && touch file보다도 낫습니다.
$_: 대부분의 셸에서 $_는 직전 명령의 마지막 인수로 확장됩니다. 같은 긴 경로를 두 번 다뤄야 할 때, 대화형 사용이나 간단한 스크립트에서 특히 유용합니다.
mkdir -p /some/ridiculously/long/path/newdir && cd "$_"
방금 만든 디렉터리로 들어가려고 경로를 다시 타이핑하거나 임시 변수를 선언할 필요가 없습니다.
셸 스크립트를 작성하고 있다면, shebang 바로 아래 맨 위에 이것들을 넣으세요. 운영 환경에 혼돈을 배포하는 일을 막아 줄 것입니다.
set -e: 오류가 나면 종료합니다. 매우 유용하지만, 경계 사례에서는 악명 높을 정도로 이상하게 동작합니다(특히 if문, while 루프, 파이프라인 같은 조건문 내부에서). 맹목적으로 믿지는 마세요. 잘못된 자신감을 줄 수 있습니다. (팁: 더 견고한 안전망으로 set -euo pipefail을 고려해 볼 수 있지만, 먼저 그 주의사항부터 익히세요.)set -u: 설정되지 않은 변수를 참조하는 것을 오류로 취급합니다. 덕분에 rm -rf /usr/local/${MY_TYPO_VAR}/*가 실수로 rm -rf /usr/local/*로 확장되는 재앙 같은 상황을 막을 수 있습니다.Linux 박스에 있거나 현대적인 대화형 셸을 사용 중이라면, 여기 있는 것들은 CLI를 녹슨 자전거가 아니라 조향할 때 실제로 반응하는 무언가처럼 느끼게 해 주는 도구들입니다.
CTRL + R: 역방향 점진 검색입니다. 지난주 화요일에 썼던 그 awk 명령 하나를 찾으려고 위쪽 화살표를 40번 누르는 일은 그만두세요. CTRL + R을 누르고 명령어의 키워드를 입력하기 시작하면, 히스토리에서 마법처럼 끄집어냅니다. 다시 CTRL + R을 누르면 일치 항목을 더 과거로 거슬러 올라가며 순환합니다.
!!: 바로 이전 명령 전체로 확장됩니다. 가장 유명한 사용 사례는 “Permission denied”라는 수치의 행진입니다. 자신 있게 systemctl restart nginx를 입력하고 엔터를 쳤더니, 시스템이 권한 부족을 비웃습니다. 다시 타이핑하는 대신, 이렇게 실행하세요.
sudo !!
이것은 셸에게 “내가 말한 대로 하되, 이번에는 권한을 갖고 해”라고 말하는 방법입니다.
CTRL + X 다음 CTRL + E: 빠른 한 줄짜리 명령을 입력하기 시작했습니다. 그러다 파이프를 하나 추가합니다. 그다음 awk 구문도 넣습니다. 어느새 프롬프트 안에서 4줄짜리 괴물을 편집하고 있고, 이동도 점점 어려워집니다. CTRL + X를 누른 뒤 CTRL + E를 누르세요(Bash에서; Zsh에서는 설정이 필요합니다). 그러면 현재 명령이 기본 텍스트 편집기(Vim이나 Nano 같은 것)로 떨어집니다. 제대로 된 편집기의 모든 기능으로 수정하고, 저장한 뒤 종료할 수 있습니다. 그러면 셸이 그 명령을 즉시 실행합니다.
fc: CTRL+X CTRL+E의 이식성 높은 전통적 형제입니다. fc를 실행하면 이전 명령이 $EDITOR에서 열립니다. 대부분의 셸에서 동작하며, 잘못된 복잡한 여러 줄 명령을 고치기에 환상적인 숨은 보석입니다.
ESC + . (또는 ALT + .): 이전 명령의 마지막 인수를 현재 커서 위치에 삽입합니다. 여러 번 누르면 히스토리를 더 거슬러 올라가며 순환하고, 필요한 정확한 파일명이나 매개변수를 현재 명령에 바로 떨어뜨려 줍니다.
!$: ESC + .의 비대화형 형제입니다. ESC + .는 현재 커서 위치에 실시간으로 텍스트를 넣어 주기 때문에 검토하거나 수정할 수 있지만, !$는 엔터를 누르는 바로 그 순간 눈먼 상태로 확장됩니다. (팁: 스크립트나 표준 sh에서는 앞서 언급한 $_ 변수를 대신 사용하세요!)
중괄호 확장은 반복 입력을 피하는 데 순수한 마법과도 같습니다. 특히 빠른 백업이나 이름 변경 작업에서 빛을 발합니다.
백업 확장: 중요한 설정 파일을 편집해야 해서, 먼저 빠른 백업을 하나 만들고 싶다고 합시다.
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}는 세 개를 한 번에 만듭니다.
<(command): 명령의 출력을 마치 파일인 것처럼 다룹니다. 예를 들어 두 파일의 정렬된 버전을 diff하고 싶다고 해 봅시다. 전통적으로는 임시 파일에 각각 정렬한 뒤, 그것들을 diff하고, 정리까지 해야 합니다. 프로세스 치환은 그 중간 단계를 건너뜁니다.
diff <(sort file1.txt) <(sort file2.txt)
** (Globstar): find는 훌륭한 명령이지만, 때로는 과하다고 느껴집니다. Bash에서 shopt -s globstar를 실행하면(Zsh에서는 기본 활성화), **는 모든 하위 디렉터리에서 재귀적으로 파일과 일치합니다. 현재 디렉터리와 그 아래 전체에서 모든 JavaScript 파일을 찾고 싶으신가요?
ls **/*.js
find 명령이 필요 없습니다.
CTRL + Z, 그다음 bg, 그다음 disown: 엄청 크고 한 시간은 걸릴 데이터베이스 가져오기 작업을 시작했는데, tmux나 screen에서 실행하는 걸 깜빡했다고 합시다. 터미널은 점유당했고, SSH 연결이 끊기면 프로세스도 죽습니다. 공포가 밀려옵니다.
CTRL + Z를 눌러 프로세스를 일시 중단(정지)합니다.bg를 입력해 백그라운드에서 다시 실행되도록 합니다. 프롬프트가 자유로워집니다!disown을 입력해 셸과의 연결을 완전히 끊습니다. 이제 노트북을 닫고, 커피를 가지러 가도, 그 프로세스는 살아남습니다.command |& tee file.log: 일반 파이프(|)는 표준 출력(stdout)만 잡습니다. 스크립트가 오류를 내면(stderr), 그것은 파이프를 건너뛰어 화면으로 직접 흘러가 버리고 로그 파일에는 남지 않습니다. |&는 stdout과 stderr를 둘 다 파이프로 보냅니다 (2>&1 |의 편리한 축약형입니다).
여기에 tee를 더하면, 화면에서 출력을 지켜보는 동시에 로그 파일로도 저장할 수 있습니다. 실시간 TV를 보면서 DVR로 녹화하는 것과 같은 느낌입니다.
셸은 장애물 코스가 아니라 도구상자입니다. 오늘 이 모든 것을 외울 필요는 없습니다. 요령 하나만 골라 일주일 동안 일상 습관에 억지로라도 넣어 보세요. 그다음 또 하나를 고르세요. 이제 터미널이 당신을 휘두르게 두지 말고, 가구를 다시 배치하기 시작하세요. 이제 이 집은 당신의 것입니다.
이 글에 댓글을 남기려면, 연결된 게시물에 답글을 다는 방식으로 당신의 Mastodon 또는 다른 ActivityPub 계정을 사용할 수 있습니다.
게시물 링크 복사
답글을 남기려면 복사한 링크를 당신의 Mastodon 인스턴스에서 검색하세요.
댓글 불러오는 중...
© 2025–2026 Christian Hofstede-Kuhn - Proudly hosted on FreeBSD