GrepBoard/매뉴얼
47 편 ·

Claude Code 상태줄에 모델·컨텍스트 표시하기

·Claude Code 2.1.302 · Ubuntu 24.04 · bash 5.2 · jq 1.7 · 스크립트는 직접 실행, 화면 표시는 공식 문서 기준·8 단계

입력창 아래에 모델 이름과 컨텍스트 사용률을 계속 띄우는 상태줄을 만듭니다. stdin JSON 을 받는 스크립트, settings.json 설정, null 처리, 갱신 시점까지 다룹니다.

상태줄은 Claude Code 가 세션 정보를 JSON 으로 스크립트의 stdin 에 넣어 주고, 스크립트가 stdout 에 찍은 글자를 입력창 아래에 그대로 보여 주는 기능입니다. 로컬에서 돌아가며 API 토큰을 쓰지 않습니다. 컨텍스트가 차는 속도를 보려는 사람에게 맞는 설정입니다. 컨텍스트가 가득 찼을 때의 동작은 컨텍스트 한도와 compact 에 있습니다.

[1] jq 가 있는지 확인합니다. 아래 스크립트가 JSON 을 읽는 데 씁니다.

console
$ jq --versionjq-1.7

[2] 스크립트를 ~/.claude/statusline.sh 로 저장합니다. 모델 표시 이름, 폴더 이름, 컨텍스트 사용률을 한 줄로 찍습니다.

~/.claude/statusline.sh
#!/bin/bash# 상태줄: [모델] 폴더 | 컨텍스트 바 NN% (size)command -v jq >/dev/null || { echo "statusline: jq not found"; exit 0; }input=$(cat) MODEL=$(jq -r '.model.display_name // "?"' <<< "$input")DIR=$(jq -r '.workspace.current_dir // .cwd // ""' <<< "$input")PCT=$(jq -r '.context_window.used_percentage // 0 | floor' <<< "$input")SIZE=$(jq -r '.context_window.context_window_size // 0' <<< "$input") # 숫자가 아니면 0, 범위는 0~100case "$PCT" in ''|*[!0-9]*) PCT=0 ;; esac[ "$PCT" -gt 100 ] && PCT=100 W=10FILLED=$((PCT * W / 100))BAR=""for ((i = 0; i < W; i++)); do  if [ "$i" -lt "$FILLED" ]; then BAR+="▓"; else BAR+="░"; fidone if [ "$SIZE" -ge 1000000 ]; then SZ="$((SIZE / 1000000))M"; else SZ="$((SIZE / 1000))k"; fiecho "[$MODEL] ${DIR##*/} | $BAR ${PCT}% of $SZ"

// 0 은 값이 null 이거나 없을 때 쓸 기본값입니다. 세션 초기에는 used_percentage 가 null 일 수 있어 이 줄이 필요합니다. ${DIR##*/} 는 경로에서 마지막 폴더 이름만 남깁니다.

[3] 실행 권한을 줍니다.

console
$ chmod +x ~/.claude/statusline.sh

[4] Claude Code 를 띄우지 말고 샘플 JSON 을 먹여 출력부터 봅니다. 필드 이름은 공식 문서의 스키마와 같습니다.

console
$ echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/app"},"context_window":{"context_window_size":200000,"used_percentage":42.7}}' | ~/.claude/statusline.sh[Opus] app | ▓▓▓▓░░░░░░ 42% of 200k

used_percentage 가 null 인 첫 응답 전 상태도 넣어 봅니다.

console
$ echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/app"},"context_window":{"context_window_size":200000,"used_percentage":null,"current_usage":null}}' | ~/.claude/statusline.sh[Opus] app | ░░░░░░░░░░ 0% of 200k

스크립트가 0 이 아닌 코드로 끝나거나 아무것도 찍지 않으면 상태줄이 빈 칸이 됩니다(공식 문서의 「Script errors or hangs」).

[5] ~/.claude/settings.json 에 등록합니다. 이미 다른 설정이 있으면 statusLine 키만 추가합니다.

~/.claude/settings.json
{ "statusLine": {   "type": "command",   "command": "~/.claude/statusline.sh" }}

command 에는 스크립트 경로 대신 한 줄짜리 셸 명령도 쓸 수 있습니다.

저장하면 Claude Code 가 설정을 다시 읽고 스크립트를 바로 실행합니다. 스크립트 파일을 고치면 다음 갱신 때부터 반영됩니다.

[6] 갱신 시점을 압니다. 스크립트는 세션이 시작될 때(재개 포함) 한 번 돌고, 그 뒤에는 이럴 때 다시 돕니다.

계기비고
새 assistant 메시지
/compact 완료
권한 모드 변경 · vim 모드 전환
statusLine 의 command 변경디바운스 없이 즉시
refreshInterval 경과설정했을 때만

변화가 몰리면 300ms 디바운스로 묶여 마지막에 한 번만 실행되고, 실행 중에 새 갱신이 오면 돌던 스크립트는 취소됩니다. 느린 명령을 넣으면 줄이 늦게 바뀝니다.

[7] 시계처럼 시간이 흐르면 바뀌는 값이나, 세션이 놀고 있는 동안 바뀌는 값을 넣을 때만 refreshInterval 을 추가합니다. 단위는 초, 최솟값은 1 입니다.

~/.claude/settings.json
{  "statusLine": {    "type": "command",    "command": "~/.claude/statusline.sh",   "refreshInterval": 30  }}

[8] 표시가 이상하면 아래 순서로 봅니다.

증상확인
아무것도 안 보임실행 권한(chmod +x), stdout 으로 찍는지, 4단계처럼 직접 실행했을 때 출력이 나오는지
처음 연 폴더에서 빈칸폴더 신뢰 대화상자를 수락해야 보임. claude --debug 에 Status line command skipped: workspace trust not accepted 가 찍힘
값이 null 또는 --첫 응답 전에는 null 일 수 있음. // 0 같은 기본값 추가

여러 줄을 echo 하면 줄마다 한 행으로 표시되고, ANSI 색 코드와 OSC 8 링크도 쓸 수 있습니다. 다만 공식 문서는 이스케이프 코드가 들어간 여러 줄 상태줄이 한 줄 일반 글자보다 표시가 깨지기 쉽다고 적고 있습니다. 터미널 폭은 스크립트 안의 tput cols 로 알 수 없고, Claude Code 가 넣어 주는 환경 변수 COLUMNS·LINES 를 읽어야 합니다.

#claude-code#statusline#jq