41P by GN⁺ 19시간전 | ★ favorite | 댓글 1개
  • 다양한 키보드 단축키와 명령 조합을 활용해 셸 환경에서 작업 속도와 효율을 높이는 방법 정리
  • CTRL + W, U, K, Y 등 기본 단축키로 줄 편집, CTRL + A/E, ALT + B/F로 커서 이동, reset으로 터미널 복구 가능
  • Bash와 Zsh에서는 CTRL + R로 명령 히스토리 검색, !!·!$·ESC+. 등으로 이전 명령 재활용, Brace ExpansionGlobstar로 반복 작업 자동화
  • 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 + Lclear 명령과 동일하게 화면을 즉시 정리
    • 현재 입력 중인 명령을 유지한 채 프롬프트를 화면 상단으로 이동
    • 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 파일에
      #!/bin/sh
      $*
      
      이렇게 해서 bash에서 zsh 스크립트를 호출할 때 noglob 충돌을 피함
    • 나는 괄호 주석을 씀. 스크립트 문서화에는 좋지만 인터랙티브 쉘에서는 번거로움. 그래도 창의적인 주석 방식이라 재미있음
    • mycmd1 #| mycmd2와 비교했을 때 어떤 장점이 있는지 궁금함
    • 이건 정말 유용해서 내 $PATH에 추가할 예정임
  • CTRL+W는 보통 이전 공백까지 삭제하므로 /var/log/nginx/ 전체를 지움
    Alt+Backspace는 비알파벳 문자 전까지 삭제함
    단, 브라우저 탭을 닫는 단축키와 겹치니 주의해야 함

    • Firefox v147부터 단축키 재정의 기능이 추가됨. 관련 링크
    • macOS에서는 GUI 단축키와 터미널 단축키가 구분되어 있어서 이런 문제 없음. ⌘C, ⌘W 등이 터미널에서도 동일하게 작동함
    • 내 환경(fish + Alacritty)에서는 반대로 동작함. 그래도 Ctrl-Shift-T로 닫힌 탭을 복구할 수 있어서 다행임
    • $WORDCHARS 설정에서 /를 제거하면 원하는 동작을 얻을 수 있음 (참고 링크)
    • Ctrl-Shift-T로 탭을 바로 복구할 수 있음
  • fzf shell integration으로 히스토리 검색을 업그레이드하길 추천함
    시연 영상 / 공식 문서

  • 자주 쓰는 트릭 하나 있음
    긴 명령을 입력하다가 다른 걸 먼저 해야 할 때, Ctrl-C로 취소하지 않고 주석 처리 후 실행해서 히스토리에 남김

    $ long_command  
    $ #long_command  
    $ stuff_1  
    $ stuff_2  
    $ #long_command  
    $ long_command
    
    • zsh에서는 "push-line-or-edit" 바인딩으로 가능하고, bash에서는 C-uC-y로 비슷하게 구현 가능함
    • 더 쉬운 방법은 ctrl-u로 현재 줄을 저장하고 비운 뒤, ctrl-y로 다시 붙이는 것임. zsh에서는 alt-q로 이 과정을 자동화할 수 있음
    • bash에서는 alt-shift-3으로 현재 명령 앞에 #을 붙이고 새 줄로 이동할 수 있음
  • 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
      
  • 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 도구도 함께 살펴보면 좋음