처리중입니다. 잠시만 기다려주세요.
TTJ 코딩클래스
정규반 단과 자료실 테크 뉴스 코딩 퀴즈
테크 뉴스
Hacker News 2026.08.12 72

셸의 느낌표는 소리치기용이 아니다: 반복 타이핑을 줄이는 이벤트 지정자와 fc

Hacker News 원문 보기

터미널 앞에 앉아 위쪽 화살표를 연타하며 이전 명령을 찾아 헤맨 경험은 개발자라면 누구에게나 있다. 흥미로운 점은, 이 반복 노동을 덜어 줄 기능이 이미 1970년대 후반부터 셸 안에 조용히 자리 잡고 있었다는 사실이다. 우리가 코드에서는 'DRY(반복하지 말라)'를 신념처럼 되뇌면서도, 정작 커맨드라인에서는 같은 명령과 인자를 손으로 다시 쳐 넣는다는 지적은 뼈아프다. 이 글은 그 간극을 메우는 두 가지 도구, 즉 이벤트 지정자(event designator)와 fc를 소개한다.

느낌표 뒤에 숨은 문법

이벤트 지정자는 bash, csh, tcsh, zsh 같은 대화형 셸에서 동작한다. 핵심은 느낌표(!)로 시작하는 짧은 표현식으로 히스토리 속 명령이나 그 일부를 직접 참조하는 것이다. 언뜻 복잡해 보이지만 구조는 일관적이다. 느낌표 바로 뒤에는 어떤 줄(이벤트)을 가리킬지 지정하고, 이어서 그 줄의 어느 부분(단어)을 쓸지, 마지막으로 그 값을 어떻게 변형(모디파이어)할지 덧붙인다. 느낌표 뒤에 곧바로 콜론이 오면 별도의 이벤트를 지정하지 않은 것으로 보고 바로 직전 줄을 참조한다.

자주 쓰는 형태는 몇 가지로 압축된다. !!는 직전 명령 전체를 그대로 다시 실행하고, !$는 직전 명령의 마지막 인자를, !는 모든 인자를 가져온다. 이들은 !:$, !: 같은 정식 표기의 축약형이다. 또한 !ssh처럼 쓰면 ssh로 시작하는 가장 최근 명령을 찾아 재실행한다. 저자가 지적하듯, 무엇을 실행할지 이미 알고 있다면 ctrl-r로 검색하는 것보다 !ssh 한 번이 더 간결하다. 모디파이어를 붙이면 인자 하나에서 경로의 일부만 떼어 내거나 문자열을 치환하는 등 세밀한 가공까지 가능하다.

안전장치 없이 쓰면 위험하다

이 편의 기능은 양날의 검이기도 하다. 느낌표가 히스토리 확장으로 해석되기 때문에, 문자열 안에 무심코 !를 넣었다가 예기치 않은 명령이 튀어나와 곤욕을 치르는 경우가 흔하다. 저자는 이를 두고 '이벤트 지정자의 편의성에 물린' 사례라고 표현한다. 실제로 실행되기 전에 결과를 확인하고 싶다면 bash에서는 shopt -s histverify, zsh에서는 setopt HIST_VERIFY를 켜 두면 된다. 엔터를 눌렀을 때 곧바로 실행되는 대신 확장된 명령이 입력 줄에 펼쳐져, 그대로 실행하거나 수정·폐기할 수 있다. 확장 결과만 미리 보고 싶다면 :p 모디파이어를 붙이면 실행 없이 출력만 되고 그 내용이 히스토리에 남으므로, 준비가 되면 !!나 위쪽 화살표로 실행하면 된다. 반대로 느낌표를 아무 데서나 평범한 문자로 쓰고 싶다면 bash의 set +H, zsh의 setopt nobanghist로 히스토리 확장을 아예 꺼 둘 수 있고, 취향에 따라 다른 문자로 바꿔 지정하는 것도 가능하다. 이런 설정은 해당 셸의 rc 파일에 넣어야 영구히 적용된다. 다만 이 마법은 대화형 셸에서만 유효하며, 배포용 셸 스크립트에 넣을 용도는 아니라는 점을 기억해야 한다.

긴 명령은 에디터에서 고치자, fc

느낌표 문법이 손에 붙지 않거나 POSIX 호환 셸을 주로 쓴다면 fc가 대안이다. fc의 진가는 단순 재실행이 아니라, 이전 명령을 셸이 아니라 자신이 쓰는 에디터에서 열어 편집한 뒤 실행할 수 있다는 데 있다. 호출할 편집기는 $FCEDIT를 따르며, 지정이 없으면 POSIX 규격상 ed로 떨어지지만 많은 셸은 $EDITOR를 기본값으로 쓴다. -e 옵션으로 편집기를 직접 지정할 수도 있다. 예컨대 여러 줄의 명령을 한꺼번에 불러와 그 안의 prod-01을 test-01로 일괄 치환한 뒤 전부 재실행하는 식의 작업은, 길고 복잡한 명령을 다룰 때 특히 유용하다.

이 도구들은 ctrl-r 히스토리 검색이나 alt-.(직전 명령의 마지막 인자 순회)를 대체하는 것이 아니다. 저자 스스로 '이거냐 저거냐'의 구도를 만들 생각은 없다고 못 박는다. ctrl-r는 강력하지만 기껏해야 수정할 템플릿을 건네줄 뿐이고, 이벤트 지정자는 명령의 일부만 정확히 뽑아낼 수 있어 결이 다르다. 결국 일을 끝내 주는 도구가 최선의 도구이며, 개인의 작업 흐름과 취향이 어떤 글보다 우선한다.

실무적으로 보면 이 기능들은 개발자를 하루아침에 10배 생산성의 존재로 만들어 주지는 않는다. 한 번에 아껴 주는 것은 고작 네댓 번에서 수십 번의 키 입력에 불과하다. 그러나 그 절약이 하루에도 수백 번, 수년의 경력에 걸쳐 쌓인다면 이야기가 달라진다. !$, !!, !ssh, :p, 그리고 fc 정도만 손에 익혀 두어도 어제의 자신보다 확실히 앞서 나갈 수 있다. 남는 키 입력은 동료에게 소리치는 대신 탕비실 잡담에 쓰라는 저자의 농담은, 오래 잊혔던 이 셸 문법이 여전히 실용적임을 가볍게 일깨운다.

이 뉴스가 유용했나요?

TTJ 코딩클래스 정규반

월급 외 수입,
코딩으로 만들 수 있습니다

17가지 수익 모델을 직접 실습하고, 1,300만원 상당의 자동화 도구와 소스코드를 받아가세요.

144+실전 강의
17개수익 모델
4.9수강생 평점
정규반 자세히 보기

"비전공 직장인인데 반년 만에 수익 파이프라인을 여러 개 만들었습니다"

실제 수강생 후기
  • 비전공자도 6개월이면 첫 수익
  • 20년 경력 개발자 직강
  • 자동화 프로그램 + 소스코드 제공

매일 AI·개발 뉴스를 받아보세요

주요 테크 뉴스를 매일 아침 이메일로 전해드립니다.

스팸 없이, 언제든 구독 취소 가능합니다.