bat 사용법: cat을 대체하는 문법 강조 지원 뷰어

bat 사용법: cat을 대체하는 문법 강조 지원 뷰어

터미널에서 코드 파일을 빠르게 훑어보고 싶을 때 보통 cat file.py라고 입력하는데요. 출력은 잘 되지만 색도 없고 줄 번호도 없어서 조금만 길어져도 가독성이 뚝 떨어집니다. 그렇다고 매번 에디터를 켜기엔 번거롭고, less로 열면 페이징은 되지만 여전히 흑백이라 아쉽죠 😅

이런 답답함을 해결해 주는 도구가 바로 bat입니다. 이름에서 짐작하셨겠지만 cat을 본떠 만든 도구인데요. Rust로 작성됐고 ripgrep, fd처럼 “기존 유닉스 도구를 현대적으로 다시 만든” 계열에 속합니다. 문법 강조, Git 통합, 줄 번호, 자동 페이징 같은 기능을 기본으로 제공하면서도 cat처럼 파이프와 잘 어울리도록 설계되어 있어요.

이번 글에서는 bat의 설치부터 자주 쓰는 옵션, 그리고 실전에서 유용한 활용법까지 살펴보겠습니다.

설치

macOS는 Homebrew로 설치하는 게 가장 간편합니다.

brew install bat

Ubuntu나 Debian 계열에서는 apt로 설치할 수 있는데, 한 가지 주의할 점이 있습니다. 패키지 이름이 bat이지만 실행 파일 이름은 batcat으로 깔립니다. 기존 시스템에 bacula-console-qt라는 다른 패키지가 /usr/bin/bat을 사용하고 있어서 충돌을 피하려고 그렇게 한 거예요.

sudo apt install bat

bat이라는 짧은 이름이 익숙하다면 심볼릭 링크를 걸어두거나 셸 설정에 별칭을 추가해 두면 편합니다.

mkdir -p ~/.local/bin
ln -s /usr/bin/batcat ~/.local/bin/bat

Rust 사용자라면 Cargo로 설치하는 것도 가능합니다.

cargo install --locked bat

설치 후 bat --version으로 정상 동작을 확인합니다.

기본 사용법

가장 기본적인 사용법은 cat과 똑같습니다. 파일 경로만 인자로 넘기면 돼요.

bat src/main.py

차이는 출력에서 바로 드러납니다. 파일 이름이 헤더로 표시되고, 줄 번호가 왼쪽에 붙고, 파일 확장자에 맞춰 키워드와 문자열에 색이 입혀집니다. 출력이 터미널 한 화면을 넘어가면 자동으로 less를 통해 페이징되고요. 화살표 키나 스페이스바로 스크롤하다가 q를 누르면 빠져나옵니다.

여러 파일을 한 번에 보고 싶을 때도 cat처럼 인자를 나열하면 됩니다.

bat README.md package.json

이때 bat은 각 파일을 헤더로 구분해서 보여주기 때문에 어디서부터 어디까지가 어떤 파일인지 헷갈리지 않아요. cat은 그냥 내용을 이어 붙여 버려서 파일 경계가 보이지 않는 것과 대조적입니다.

문법 강조

bat의 가장 큰 장점은 역시 문법 강조입니다. 200개 이상의 언어를 기본으로 지원하고, 파일 확장자나 셔뱅(shebang) 라인으로 언어를 자동 감지합니다.

확장자가 없거나 감지가 잘못된 경우에는 -l(--language) 옵션으로 언어를 명시할 수 있습니다.

bat -l json config
bat -l yaml docker-compose

지원하는 언어 목록은 --list-languages로 확인할 수 있어요.

bat --list-languages

JSON이나 로그처럼 정해진 포맷이 있는 데이터를 빠르게 검사할 때 특히 유용합니다.

출력 스타일 설정

bat--style 옵션을 사용해 파일 내용 외에 어떤 요소(줄 번호, 그리드, 파일 이름 헤더 등)를 함께 보여줄지 상세히 제어할 수 있습니다. 콤마(,)를 사용해 여러 컴포넌트를 조합해서 넘길 수 있어요.

자주 사용하는 주요 컴포넌트와 사전 정의된 스타일은 다음과 같습니다.

  • default: 기본 추천 스타일 컴포넌트들을 활성화합니다. (기본값)
  • full: 사용 가능한 모든 컴포넌트를 활성화합니다.
  • plain: 모든 장식을 끄고 텍스트만 보여줍니다. (-p / --plain과 동일)
  • numbers: 줄 번호만 표시합니다.
  • changes: Git 변경 상태 표시 마커(+, ~, -)를 표시합니다.
  • header: 파일명(파일명 헤더)을 표시합니다. (header-filename과 동일)
  • header-filesize: 파일 크기도 헤더에 함께 표시합니다.
  • grid: 테두리 및 사이드바 구분선(그리드)을 표시합니다.
  • rule: 파일 구분을 위한 가로 구분선(가로선)을 표시합니다.
  • snip: 줄 범위를 지정해서 볼 때 잘려 나간 영역을 구분하는 줄을 표시합니다.

예를 들어, 파일명 헤더와 줄 번호만 깔끔하게 보고 싶다면 다음과 같이 조합해서 넘길 수 있습니다.

bat --style=header,numbers src/utils.ts

이 스타일 설정은 매번 명령줄에 적지 않고 BAT_STYLE 환경 변수로 지정(export BAT_STYLE="header,numbers")하거나, 설정 파일(~/.config/bat/config)에 --style="header,numbers" 형태로 적어두어 기본값으로 굳힐 수도 있습니다.

줄 번호와 범위 지정

bat은 기본적으로 줄 번호나 그리드 같은 장식을 표시하지만, 이를 모두 끄고 텍스트만 깔끔하게 보고 싶을 때가 있는데요. 이때는 -p 또는 --plain 옵션을 사용하면 됩니다. (이 옵션은 --style=plain과 똑같이 동작합니다.)

bat -p src/main.py

특정 범위만 보고 싶다면 -r(--line-range) 옵션을 쓰면 됩니다. 코드 리뷰 중에 “47번째 줄 근처를 확인해 줘”라는 요청을 받았을 때 유용해요.

bat -r 40:60 src/main.py

시작이나 끝 둘 중 하나만 지정하는 것도 가능합니다. -r :30은 처음부터 30번째 줄까지, -r 100:은 100번째 줄부터 끝까지라는 의미예요.

특정 줄을 강조 표시하고 싶을 때는 -H(--highlight-line) 옵션을 사용합니다.

bat -H 47 src/main.py

해당 줄에 배경색이 입혀져서 한눈에 들어오는데요. 버그가 있는 줄이나 리뷰 대상 줄을 콕 집어서 보여줄 때 자주 쓰게 됩니다.

Git 통합

bat은 Git 저장소 안에 있는 파일을 표시할 때 변경 사항도 같이 보여줍니다. 줄 번호 옆에 추가된 줄에는 +, 수정된 줄에는 ~, 삭제된 줄 위치에는 - 표시가 붙어요.

bat src/utils.ts

git diff를 보지 않고도 어떤 부분이 마지막 커밋 이후로 바뀌었는지 한눈에 파악할 수 있어서, 작업하던 파일이 어디까지 진행됐는지 다시 확인할 때 편리합니다.

이 기능이 산만하게 느껴진다면 앞서 살펴본 --style 옵션을 사용해 줄 번호만 표시하고 Git 마커는 제외할 수 있습니다.

bat --style=numbers src/utils.ts

파이프와 함께 쓰기

bat은 파이프 입력도 자연스럽게 받습니다. 표준 입력으로 들어온 데이터에 문법 강조를 입혀서 출력해 주죠. curl로 API 응답을 받아 바로 들여다볼 때 특히 빛을 발합니다.

curl -s https://api.github.com/users/octocat | bat -l json

jq처럼 JSON을 가공한 결과를 색깔 있게 보고 싶을 때도 마찬가지입니다.

cat package.json | jq '.dependencies' | bat -l json

bat이 출력 대상이 파이프인지 터미널인지 자동으로 감지한다는 점도 알아둘 만한데요. 다른 명령어로 파이프를 넘기면 색깔이나 헤더 같은 장식을 모두 제거하고 cat처럼 평범한 텍스트를 흘려보냅니다. 그래서 bat file.py | grep TODO 같은 조합도 문제없이 동작합니다.

만약 파이프로 넘기면서도 색깔을 유지하고 싶다면 --color=always를 명시하면 됩니다.

bat --color=always src/main.py | less -R

페이징과 테마

bat은 출력이 터미널 높이를 넘어가면 자동으로 페이저를 띄웁니다. 기본 페이저는 less인데, 환경 변수로 바꿀 수 있어요.

페이징이 거슬릴 때는 --paging=never로 끄면 됩니다. 로그 파일을 실시간으로 따라다닐 때처럼 페이징이 방해되는 상황에서 유용해요.

tail -f /var/log/syslog | bat --paging=never -l log

테마는 --list-themes로 확인하고 --theme으로 적용합니다.

bat --list-themes
bat --theme=Dracula src/main.py

기본 테마는 다크 모드와 라이트 모드에 각각 잘 어울리는 두 가지가 자동 적용되는데, 취향에 맞는 테마를 고르고 싶다면 한 번쯤 살펴볼 만합니다.

설정 파일로 기본값 굳히기

매번 같은 옵션을 입력하는 게 번거롭다면 설정 파일을 만들어 두는 게 좋습니다. bat --generate-config-file 명령으로 기본 설정 파일을 생성할 수 있고, 보통 ~/.config/bat/config 경로에 저장됩니다.

bat --generate-config-file

만약 설정 파일이 이미 존재하는지 확인하고 싶거나 정확한 경로를 알고 싶다면 --config-file 옵션을 쓰면 되는데요.

bat --config-file

이 명령어는 bat이 사용하는 설정 파일의 경로를 보여줍니다. 이 경로를 복사해서 ls 명령어로 확인해 보거나 에디터로 직접 열어볼 수 있어요.

설정 파일은 명령줄에 넘기는 인자를 한 줄에 하나씩 적는 형식이에요.

~/.config/bat/config
--theme="Dracula"
--style="numbers,changes,header"
--paging=auto

이렇게 해두면 매번 옵션을 일일이 적지 않아도 원하는 스타일로 출력됩니다. 환경 변수 BAT_CONFIG_PATH로 설정 파일 위치를 바꾸는 것도 가능합니다.

cat 별칭으로 쓸 때 주의할 점

bat이 마음에 들어서 cat을 아예 대체하려고 별칭을 거는 분들이 있는데요. 셸 설정에 다음 같이 한 줄을 추가하는 식입니다.

alias cat='bat --paging=never'

편리하긴 하지만, 두 가지 점을 염두에 두는 게 좋습니다. 우선 스크립트나 자동화 환경에서 cat을 쓰는 경우 bat이 의도치 않은 색 코드를 끼워 넣을 수 있어요. 다행히 앞서 말한 것처럼 파이프 출력에서는 bat이 알아서 색을 빼기 때문에 큰 문제는 없지만, 별칭을 거는 셸이 인터랙티브 셸인지 확인해 두는 게 안전합니다.

또 하나, cat의 진짜 용도는 파일을 이어 붙이는(concatenate) 것이지 화면에 출력하는 게 아닙니다. bat은 사람이 읽기 편하게 보여주는 데 초점을 맞춘 도구이기 때문에, “여러 파일을 합쳐서 표준 출력으로 보낸다”는 본래 cat의 역할을 대신하기엔 무겁습니다. 별칭을 걸더라도 cat 본체는 \cat이나 command cat으로 우회해서 호출할 수 있다는 점은 기억해 둘 만해요.

help 문서 예쁘게 보기

마지막으로 살짝 별난 활용법인데요. --help 출력에 문법 강조를 입히는 트릭이 있습니다.

tar --help | bat -p -l help

앞서 살펴본 -p(--plain) 옵션으로 장식을 모두 빼고, -l help로 도움말 전용 문법을 적용합니다. 자주 들춰 보는 명령어의 옵션을 색깔로 구분해서 볼 수 있어서 의외로 자주 쓰게 돼요.

자주 사용하는 명령에 함수를 하나 만들어 두면 더 편합니다.

help() {
  "$@" --help 2>&1 | bat -p -l help
}

이제 help tar, help curl 같은 식으로 호출할 수 있어요.

마치며

bat은 거창한 기능이 있는 도구는 아니지만, 매일 수십 번씩 마주치는 cat의 자리를 자연스럽게 채워 주는 작은 업그레이드입니다. 문법 강조와 줄 번호만 있어도 코드를 훑어볼 때 시선의 피로가 확연히 줄어들고, Git 통합과 페이징까지 더해지면 별도 에디터를 켜지 않고도 꽤 많은 일을 터미널 안에서 마칠 수 있습니다.

fd, ripgrep과 함께 Shell 관련 도구들을 하나씩 손에 익혀 가면, 터미널이 점점 더 쾌적한 작업 공간으로 바뀌는 걸 느끼게 될 거예요. 더 자세한 옵션과 기능은 bat 공식 저장소를 참고하세요.

This work is licensed under CC BY 4.0 CC BY

개발자를 위한 뉴스레터

달레가 정리한 AI 개발 트렌드와 직접 만든 콘텐츠를 전해드립니다.

Discord