SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

วิธีตั้งค่า Claude Code statusline บน VPS ป้องกันพิมพ์ผิด

เรียนรู้วิธีตั้งค่า statusLine ใน Claude Code เพื่อแสดง hostname ไดเรกทอรี และ git branch บน VPS ช่วยป้องกันการรันคำสั่งผิดเครื่องด้วยการแสดงข้อมูลผ่าน stdout โดยตรง

สิ่งที่แสดงใน statusline ของ Claude Code

statusline ของ Claude Code คือแถวที่อยู่ใต้บรรทัดรับคำสั่ง (prompt) ซึ่งจะแสดงผลลัพธ์จากสคริปต์ที่คุณเขียนขึ้น คุณสามารถเพิ่มบล็อก statusLine เข้าไปใน settings.json และระบุคำสั่งที่ต้องการให้ทำงาน Claude Code จะรันคำสั่งนั้นโดยส่งสถานะของเซสชันในรูปแบบ JSON ผ่านทาง standard input และจะพิมพ์ข้อความใดก็ตามที่คำสั่งนั้นส่งออกมายัง standard output

นี่คือข้อตกลงทั้งหมด สคริปต์ของคุณจะอ่านข้อมูล JSON จาก stdin และพิมพ์ข้อความออกทาง stdout สคริปต์นี้ทำงานบนเครื่องของคุณเองและไม่มีข้อมูลใดที่พิมพ์ออกมาถูกส่งไปยังโมเดล ดังนั้นจึงไม่มีการคิดค่าใช้จ่ายเป็นโทเค็น

บนแล็ปท็อปที่มีโปรเจกต์เดียว สิ่งนี้อาจเป็นเพียงการตกแต่ง แต่บนเซิร์ฟเวอร์สามเครื่อง มันคืออุปกรณ์ป้องกันความปลอดภัย เซสชันของ Claude Code ทุกเซสชันจะมีหน้าตาเหมือนกันในทุกเทอร์มินัล ดังนั้นการเปิดหน้าต่าง SSH สี่หน้าต่างโดยไม่มีป้ายกำกับจึงเป็นสาเหตุที่ทำให้การย้ายข้อมูล (migration) ไปลงผิดเครื่อง การมี statusline ที่ขึ้นต้นด้วย hostname จะช่วยป้องกันความผิดพลาดประเภทนี้ได้

ตำแหน่งการตั้งค่า statusLine ใน settings.json

ให้ใส่การตั้งค่านี้ไว้ใน user settings ที่ ~/.claude/settings.json ซึ่งจะมีผลกับทุกโปรเจกต์บนเครื่องนั้น หรือจะใช้ project settings ที่ .claude/settings.json ภายใน repository ก็ได้เช่นกัน โดยค่าในส่วนนี้จะมีลำดับความสำคัญสูงกว่าสำหรับ directory นั้น

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

type จะเป็น "command" เสมอ ค่าของ command จะถูกรันผ่าน shell ดังนั้นจึงสามารถระบุเป็น path ของสคริปต์หรือคำสั่งทั่วไปก็ได้ ให้ทดสอบว่าการเชื่อมต่อทำงานได้จริงก่อนที่จะเขียนสคริปต์ใดๆ:

{
  "statusLine": {
    "type": "command",
    "command": "hostname -s"
  }
}

เริ่มการทำงานของ Claude Code แล้วส่งข้อความหนึ่งครั้ง แถบด้านล่าง prompt จะแสดงชื่อโฮสต์แบบย่อของเซิร์ฟเวอร์ หากแถบยังคงว่างเปล่า แสดงว่าปัญหาอยู่ที่การตั้งค่าหรือกล่องโต้ตอบความเชื่อถือ (trust dialog) ไม่ใช่ที่สคริปต์ของคุณ โปรดอ่านหัวข้อ "ทำไม statusline ถึงว่างเปล่า" ด้านล่าง

มีคีย์เสริม 3 รายการ ณ เดือนสิงหาคม 2026 ได้แก่ padding ซึ่งใช้เพิ่มระยะห่างแนวนอนโดยนับเป็นจำนวนตัวอักษร โดยค่าเริ่มต้นคือ 0 ส่วน refreshInterval ใช้สำหรับรันคำสั่งซ้ำทุกๆ N วินาที นอกเหนือไปจากทริกเกอร์ปกติ โดยมีค่าขั้นต่ำอยู่ที่ 1 ซึ่งคุณควรใช้เฉพาะในกรณีที่บรรทัดดังกล่าวแสดงนาฬิกาหรือข้อมูลที่มีการเปลี่ยนแปลงในขณะที่ session ไม่ได้มีการใช้งาน และ hideVimModeIndicator ใช้สำหรับปิดการแสดงข้อความ -- INSERT -- ที่มีมาให้ในตัว ในกรณีที่สคริปต์ของคุณแสดงผล vim mode ด้วยตัวเองอยู่แล้ว

สคริปต์ statusline ได้รับข้อมูลอะไรบ้าง

อย่าเชื่อรายการฟิลด์ที่คุณอ่านจากที่ใดก็ตาม รวมถึงหน้านี้ด้วย ให้ดักจับออบเจกต์จริงที่เวอร์ชันของคุณส่งออกมา เขียนสคริปต์ชั่วคราวเพื่อบันทึก stdin ลงในไฟล์:

cat > ~/.claude/statusline-capture.sh <<'EOF'
#!/bin/bash
cat > /tmp/statusline-input.json
echo "captured"
EOF
chmod +x ~/.claude/statusline-capture.sh

ชี้ statusLine.command ไปที่ไฟล์นั้น เริ่มเซสชัน และส่งข้อความหนึ่งข้อความ แถบสถานะจะอ่านค่า captured ตอนนี้ให้ดูสิ่งที่ได้รับ:

jq . /tmp/statusline-input.json

คุณจะได้โครงสร้างที่แน่นอนสำหรับบิลด์ของคุณ และคุณสามารถทำซ้ำขั้นตอนนี้ได้ทุกเมื่อที่มีการอัปเดตเปลี่ยนแปลงข้อมูล

ส่วนที่เสถียรตามเอกสาร ณ เดือนสิงหาคม 2026 คือออบเจกต์ที่ซ้อนกันแทนที่จะเป็นคีย์แบบแบน model เก็บ id และ display_name ไว้ workspace เก็บ current_dir และ project_dir ไว้: current_dir คือตำแหน่งที่เซสชันอยู่ปัจจุบัน project_dir คือตำแหน่งที่เซสชันถูกเรียกใช้งาน และทั้งสองค่าจะต่างกันเมื่อไดเรกทอรีทำงานเปลี่ยนไปในระหว่างเซสชัน cwd ในระดับบนสุดจะมีค่าเดียวกับ workspace.current_dir context_window เก็บจำนวนโทเค็นบวกกับค่า used_percentage ที่คำนวณไว้ล่วงหน้า cost เก็บตัวนับ total_cost_usd และระยะเวลา session_id จะเสถียรตลอดอายุของเซสชันและไม่ซ้ำกันในแต่ละเซสชัน ซึ่งมีความสำคัญสำหรับการแคชในภายหลัง

กฎ 3 ข้อที่จะช่วยให้สคริปต์ทำงานได้แม้มีการเปลี่ยนแปลงสคีมา

บางคีย์อาจไม่มีอยู่จริง ไม่ใช่แค่เป็นค่าว่าง (null) vim, agent, pr, worktree และ effort จะปรากฏเฉพาะเมื่อฟีเจอร์ที่เกี่ยวข้องทำงานอยู่เท่านั้น การอ่าน .vim.mode ด้วย jq -r ในขณะที่โหมด vim ปิดอยู่ จะแสดงผลเป็นสตริงตัวอักษร null และแถบสถานะของคุณจะแสดง null ให้ผู้ใช้เห็น ให้เพิ่ม // empty ต่อท้ายทุกตัวเลือก (selector) เพื่อให้คีย์ที่หายไปไม่แสดงผลใดๆ ออกมา

บางค่าอาจเป็น null ในช่วงแรก context_window.used_percentage และ context_window.current_usage จะเป็น null ก่อนการตอบกลับจาก API ครั้งแรก และ current_usage จะกลับไปเป็น null หลังจาก /compact จนกว่าการเรียกครั้งถัดไปจะเติมข้อมูลกลับเข้าไป ดังนั้นเปอร์เซ็นต์บริบทบนแถบสถานะจึงจำเป็นต้องใช้ // 0 มิฉะนั้นจะแสดงค่า null ในช่วงวินาทีแรกของทุกเซสชัน ก่อนที่คุณจะนำตัวเลขนั้นไปแสดงบนแถบสถานะ การทราบ วิธีการเติมข้อมูลในหน้าต่างบริบทจริงๆ จะช่วยได้มาก

git branch ไม่มีอยู่ใน JSON ไม่มีฟิลด์ใดรายงานค่านี้ สาขา (branch) ใดๆ บนแถบสถานะของคุณต้องมาจากสคริปต์ของคุณที่รันคำสั่ง git ด้วยตัวเอง

สคริปต์แสดงสถานะที่ทำงานแบบลดระดับความสามารถแทนการหยุดทำงาน

นี่คือเวอร์ชันสำหรับคัดลอกและวาง สคริปต์นี้จะแสดง hostname, ไดเรกทอรีปัจจุบัน, branch ของ git และชื่อรุ่น ทุกฟิลด์มีค่าสำรองไว้ ดังนั้นแม้จะเป็นออบเจกต์ JSON ที่ว่างเปล่า ก็ยังคงแสดงบรรทัดที่ใช้งานได้

#!/bin/bash
# ~/.claude/statusline.sh
input=$(cat)

# Read one field. Prints nothing when the key is missing or null.
field() { printf '%s' "$input" | jq -r "$1 // empty" 2>/dev/null; }

HOST=$(hostname -s 2>/dev/null)
[ -z "$HOST" ] && HOST="host"

DIR=$(field '.workspace.current_dir')
[ -z "$DIR" ] && DIR=$(field '.cwd')
[ -z "$DIR" ] && DIR="$PWD"

MODEL=$(field '.model.display_name')
[ -z "$MODEL" ] && MODEL="claude"

SHORT="$DIR"
if [ -n "$HOME" ]; then
  case "$DIR" in
    "$HOME") SHORT="~" ;;
    "$HOME"/*) SHORT="~/${DIR#"$HOME"/}" ;;
  esac
fi

BRANCH=""
if git -C "$DIR" rev-parse --git-dir >/dev/null 2>&1; then
  BRANCH=$(git -C "$DIR" branch --show-current 2>/dev/null)
  [ -z "$BRANCH" ] && BRANCH="detached"
fi

CYAN=$'\033[36m'
YELLOW=$'\033[33m'
DIM=$'\033[2m'
RESET=$'\033[0m'

LINE="${CYAN}${HOST}${RESET} ${SHORT}"
[ -n "$BRANCH" ] && LINE="${LINE} ${YELLOW}${BRANCH}${RESET}"
LINE="${LINE} ${DIM}${MODEL}${RESET}"

printf '%s\n' "$LINE"

การอ่านทุกครั้งจะผ่าน field ซึ่งจะต่อท้ายด้วย // empty ดังนั้นหากมีการเปลี่ยนชื่อหรือลบคีย์ออก ผลลัพธ์จะเป็นสตริงว่างและบรรทัดถัดไปจะให้ค่าเริ่มต้นแทน ไดเรกทอรีจะใช้ค่าสำรองจาก workspace.current_dir ไปยัง cwd และ $PWD ตามลำดับ ส่วน branch จะดึงมาจาก git -C "$DIR" แทนที่จะใช้ git โดยตรง เพื่อให้ branch ตรงกับไดเรกทอรีที่แถบสถานะแสดงอยู่เสมอ

บันทึกไฟล์แล้วทำให้เป็นไฟล์ที่รันได้:

chmod +x ~/.claude/statusline.sh

การตั้งค่า execute bit เป็นสิ่งที่จำเป็น Claude Code จะรันคำสั่งผ่าน shell ดังนั้นสคริปต์ที่ไม่มี +x จะล้มเหลวด้วย Permission denied ส่งผลให้ไม่มี stdout และแถวสถานะจะว่างเปล่าโดยไม่มีข้อความแจ้งเตือนที่มองเห็นได้

jq ใช้สำหรับประมวลผล JSON บนบรรทัดคำสั่ง ซึ่งไม่ได้ถูกติดตั้งมาพร้อมกับ Ubuntu server รุ่นเริ่มต้น:

sudo apt update && sudo apt install -y jq

จากนั้นกำหนดค่าการตั้งค่าให้ชี้ไปยังสคริปต์ โดยใช้บล็อก settings.json แรกที่ระบุไว้ด้านบน

ทดสอบสคริปต์ก่อนใช้งานจริง

ให้รันสคริปต์ด้วยตนเองสองครั้ง ครั้งแรกใช้ object ของ session ปกติ:

echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/api"},"session_id":"t1"}' | ~/.claude/statusline.sh

คุณจะได้ชื่อโฮสต์ ตามด้วย /srv/api และ Opus จะไม่มีชื่อ branch ปรากฏขึ้น เนื่องจาก /srv/api บนเครื่องของคุณอาจไม่ใช่ git repository

ครั้งที่สองคือการทดสอบความทนทานต่อข้อผิดพลาด (degradation test) ซึ่งเป็นขั้นตอนที่คนมักข้ามไป:

echo '{}' | ~/.claude/statusline.sh

การส่ง object ว่างเปล่าคือกรณีที่เลวร้ายที่สุดที่การเปลี่ยนแปลง schema จะส่งผลต่อคุณได้ บรรทัดดังกล่าวยังคงแสดงผล: ชื่อโฮสต์, ไดเรกทอรีปัจจุบันจาก $PWD และคำว่า claude ในตำแหน่งที่ควรจะเป็นชื่อโมเดล ไม่มีส่วนใดที่ทำงานผิดพลาดและไม่มีการพิมพ์ null ออกมา สคริปต์ที่ผ่านการทดสอบนี้จะสามารถทำงานต่อไปได้แม้มีการเปลี่ยนชื่อ field เพราะสำหรับสคริปต์ของคุณแล้ว การเปลี่ยนชื่อ field และการที่ field หายไปถือเป็นเหตุการณ์เดียวกัน

สิ่งที่คุณควรเห็น

Statusline จะแสดงผลในแถวของตัวเองเหนือแถบ footer มาตรฐานและไม่ได้เข้ามาแทนที่ ในการตั้งค่าที่ทำงานได้ปกติ แถวนี้จะมีลักษณะดังนี้: ชื่อโฮสต์แบบย่อในสีฟ้า ตามด้วยไดเรกทอรีปัจจุบันโดยที่โฮมไดเรกทอรีจะถูกย่อเป็น ~, ชื่อ branch ในสีเหลืองเมื่อไดเรกทอรีเป็น git repository และชื่อโมเดลในสีจาง ผลลัพธ์ควรมีลักษณะใกล้เคียงกับ web-01 ~/api main Opus โดยมีองค์ประกอบทั้งสี่สีนี้ปรากฏอยู่

แถวดังกล่าวจะรันสคริปต์ของคุณใหม่เมื่อเริ่มเซสชัน รวมถึงการ resume, เมื่อมีข้อความใหม่จาก assistant, หลังจาก /compact ทำงานเสร็จสิ้น, เมื่อโหมดสิทธิ์การเข้าถึงเปลี่ยน, เมื่อสลับโหมด vim และเมื่อเกิด refreshInterval tick หากคุณตั้งค่าไว้ การอัปเดตจะถูกหน่วงเวลาไว้ที่ 300 ms เพื่อให้การเปลี่ยนแปลงที่เกิดขึ้นรัวๆ รันสคริปต์เพียงครั้งเดียว แถบนี้จะซ่อนตัวระหว่างการทำ autocomplete, เมนูช่วยเหลือ และการแจ้งเตือนสิทธิ์การเข้าถึง ก่อนจะกลับมาแสดงผลอีกครั้ง

เหตุผลที่ต้องวาง hostname ไว้ลำดับแรก

เมื่อคุณรันเอเจนต์บนเซิร์ฟเวอร์มากกว่าหนึ่งเครื่อง เทอร์มินัลคือสิ่งเดียวที่บอกคุณว่าคุณอยู่ที่ไหน แต่เทอร์มินัลมักหลอกลวงคุณได้ หากคุณเปิดการเชื่อมต่อ ssh ที่สองจากภายใน tmux pane ชื่อหน้าต่างมักจะยังคงเป็นชื่อเดิม เพราะชื่อนั้นถูกกำหนดโดยเชลล์ที่ไม่ทราบว่ามีการย้ายตำแหน่ง หากคุณทิ้ง Claude Code ให้รันอยู่ใน tmux session แบบ detached บน VPS แล้วกลับมาเชื่อมต่อใหม่ในวันถัดไป จะไม่มีสิ่งใดบนหน้าจอบอกความแตกต่างระหว่างเซิร์ฟเวอร์ build กับเซิร์ฟเวอร์ production ได้เลย

แถบสถานะ (statusline) แตกต่างออกไปเพราะถูกเรนเดอร์โดยตัว Claude Code เองในแต่ละเซสชัน จากข้อมูลที่เซสชันนั้นถืออยู่ จึงไม่สามารถถูกสืบทอดมาจาก pane ที่ผิดพลาด หรือค้างอยู่จาก shell prompt ที่ไม่ได้รีเฟรช สิ่งที่แสดงบนแถบสถานะคือเครื่องที่เอเจนต์กำลังเขียนไฟล์อยู่จริง

กำหนดสีให้แต่ละเซิร์ฟเวอร์เพื่อให้คุณจำแนกได้ทันทีโดยไม่ต้องอ่านข้อความ เพิ่มสองบรรทัดนี้ลงไปก่อนการกำหนดค่า LINE=:

CODE=$(printf '%s' "$HOST" | cksum | cut -d' ' -f1)
HOST_COLOR=$(printf '\033[%dm' "$((31 + CODE % 6))")

จากนั้นใช้ ${HOST_COLOR} แทนที่ ${CYAN} โดย cksum จะพิมพ์ค่า checksum ของ hostname ออกมา ทำให้ชื่อหนึ่งๆ จะจับคู่กับสีเดิมเสมอในช่วง 31 ถึง 36 ซึ่งเป็นสีตั้งแต่แดงไปจนถึงฟ้า (cyan) เพียงคัดลอกสคริปต์เดียวกันนี้ไปยังทุกเครื่อง แต่ละเครื่องก็จะระบุตัวตนของตัวเองโดยอัตโนมัติ

ไดเรกทอรีมีความสำคัญด้วยเหตุผลเดียวกัน /srv/api และ /srv/api-staging อยู่ห่างกันเพียงปุ่มเดียวในคำสั่ง ssh แต่ส่งผลกระทบต่อเหตุการณ์ที่แตกต่างกันอย่างสิ้นเชิง โมเดลและ branch คืออีกสองสิ่งที่คุ้มค่ากับพื้นที่ที่เสียไป โมเดลจะบอกคุณว่าคุณได้กลับมาใช้งานเซสชันไหน และ branch จะบอกคุณว่าเอเจนต์กำลังจะ commit ลงบน main หรือไม่

หน้าจอขนาดเล็กทำให้สิ่งเหล่านี้ชัดเจนยิ่งขึ้น เนื่องจากไม่มีชื่อหน้าต่างให้พึ่งพา หากนั่นคือการตั้งค่าของคุณ โปรดดู การควบคุม Claude Code จากโทรศัพท์

รักษาความเร็วของสคริปต์

สคริปต์ของคุณจะทำงานทุกครั้งที่มีข้อความจากผู้ช่วย และ Claude Code จะยกเลิกการทำงานที่ค้างอยู่เมื่อมีการอัปเดตใหม่เข้ามา ดังนั้นสคริปต์ที่ทำงานช้าจะทำให้แสดงข้อความที่ล้าสมัยหรือไม่แสดงข้อความเลย

การเรียกใช้ jq แต่ละครั้งใช้เวลาเพียงไม่กี่มิลลิวินาที ส่วน git คือส่วนที่ทำให้เกิดความล่าช้า โดย git status ใน repository ขนาดใหญ่ที่มี cache ว่างเปล่าอาจใช้เวลาหลายร้อยมิลลิวินาที สคริปต์ข้างต้นจึงหลีกเลี่ยงการใช้ git status โดยเจตนาและเลือกใช้ git branch --show-current แทน ซึ่งจะอ่านค่าจาก .git/HEAD และส่งค่ากลับทันที

หากคุณต้องการเพิ่มการทำงานที่หนักขึ้น ให้เก็บข้อมูลไว้ในไฟล์ cache และรีเฟรชทุกๆ สองสามวินาที โดยใช้ session เป็นตัวกำหนดคีย์ของไฟล์:

CACHE="/tmp/statusline-$(field '.session_id')"

ให้ใช้ session_id แทน $$ เนื่องจาก $$ คือ process ID ของสคริปต์คุณ ซึ่งจะเปลี่ยนไปทุกครั้งที่เรียกใช้ ทำให้ cache ที่อ้างอิงตาม ID นี้ไม่เคยถูกใช้งานจริงและคุณต้องเสียเวลาประมวลผลเต็มจำนวนทุกครั้ง ในขณะที่ session_id จะคงที่ตลอดทั้ง session และแตกต่างกันในแต่ละ session ทำให้ Claude Code สอง session ในสอง repository ไม่สามารถอ่านชื่อ branch ที่ cache ไว้ของกันและกันได้

ข้อจำกัดอีกประการที่ควรทราบคือ tput cols ไม่สามารถทำงานภายในสคริปต์ statusline ได้ เนื่องจาก Claude Code จะดักจับ output แทนที่จะเชื่อมต่อสคริปต์ของคุณเข้ากับ terminal ทำให้การตรวจจับความกว้างไม่มีค่าให้วัด ทั้งนี้ Claude Code จะตั้งค่า environment variable COLUMNS และ LINES ก่อนรันคำสั่ง (ในเวอร์ชัน 2.1.153 เป็นต้นไป) ดังนั้นให้คุณอ่านค่าจาก $COLUMNS เมื่อต้องการตัดสินใจว่าจะแสดงผลมากน้อยเพียงใด

เหตุใดแถบสถานะจึงว่างเปล่า

ไม่มีอะไรปรากฏขึ้นเลย ให้ตรวจสอบสิทธิ์การ execute ด้วย ls -l ~/.claude/statusline.sh จากนั้นลองรันสคริปต์ด้วยตนเองโดยใช้ข้อมูลนำเข้าจำลองตามด้านบน หากสคริปต์แสดงผลลัพธ์ที่ shell แต่ไม่แสดงใน Claude Code ให้เริ่มต้นด้วย claude --debug ซึ่งจะบันทึก exit code และ stderr ของการรัน statusline ครั้งแรกในเซสชันนั้น

debug log ระบุว่า Status line command skipped: workspace trust not accepted statusline จะรันคำสั่ง shell ดังนั้นจึงอยู่ภายใต้เกณฑ์การตรวจสอบความน่าเชื่อถือของ workspace (workspace trust gate) เช่นเดียวกับ hooks จนกว่าคุณจะยอมรับกล่องข้อความยืนยันความน่าเชื่อถือสำหรับไดเรกทอรีนั้น คำสั่งจะไม่ถูกรัน กรณีนี้พบได้บ่อยบน VPS ซึ่งทุกการ clone ใหม่จะเป็นไดเรกทอรีที่ Claude Code ยังไม่เคยรู้จัก ให้รีสตาร์ท Claude Code ในไดเรกทอรีนั้นแล้วกดยอมรับในกล่องข้อความ

ทุกอย่างว่างเปล่าและมีการตั้งค่า disableAllHooks ไว้ "disableAllHooks": true ใน settings.json จะปิดการทำงานของ statusline ด้วยเช่นกัน เนื่องจากเป็นเกณฑ์การรัน shell เดียวกัน ให้ลบออกหรือตั้งค่าเป็น false

แถวแสดงผลเป็น null ตัวเลือก jq เข้าถึงคีย์ที่ไม่มีอยู่หรือเป็น null และ jq -r จะแสดงค่า null เป็นอักขระสี่ตัวคือ null ให้เพิ่ม // empty สำหรับข้อความ และ // 0 สำหรับตัวเลข

แถวว่างเปล่าทันทีหลังจากที่คุณแก้ไขสคริปต์ คำสั่งที่ exit ด้วยค่าที่ไม่ใช่ศูนย์ หรือไม่พิมพ์อะไรออกมาเลย จะทำให้แถวนั้นว่างเปล่า สาเหตุที่พบบ่อยคือบรรทัดสุดท้ายเป็นคำสั่งอย่าง [ -n "$BRANCH" ] && LINE="..." ซึ่งจะ exit 1 เมื่อ branch ว่างเปล่าและส่งผลต่อ exit code ของสคริปต์ทั้งหมด ให้คง printf ไว้เป็นบรรทัดสุดท้าย หรือเพิ่ม exit 0

Escape codes แสดงเป็นข้อความตัวอักษร เช่น \e]8;; บนแถบ ให้ใช้ printf '%b' แทน echo -e ลิงก์ OSC 8 ที่คลิกได้จำเป็นต้องใช้ terminal ที่รองรับ และ tmux หรือ SSH อาจตัดลำดับคำสั่งเหล่านี้ออก ดังนั้นการใช้สีแบบปกติจึงเป็นทางเลือกที่ปลอดภัยกว่าเมื่อใช้งานบนเครื่องระยะไกล

ด้านขวาของแถวถูกตัดออก การแจ้งเตือนของระบบและตัวนับ token ในโหมด verbose จะใช้พื้นที่แถวนั้นร่วมกันจากทางด้านขวา หาก terminal แคบเกินไปจะทำให้เกิดการทับซ้อนกัน ให้รักษาความยาวของผลลัพธ์ให้สั้น หากต้องการดูการใช้งานจริงแทนที่จะเป็นตัวเลขบนแถบ ให้ดูที่ วิธีที่ Claude Code นับจำนวน token

FAQ

การตั้งค่า statusline ของ Claude Code อยู่ที่ไหน?

อยู่ใน settings.json โดยเป็นบล็อก statusLine ที่กำหนด type เป็น "command" และกำหนด command เป็นพาธของสคริปต์หรือคำสั่งเชลล์ การตั้งค่าของผู้ใช้จะอยู่ที่ ~/.claude/settings.json ซึ่งจะมีผลกับทุกโปรเจกต์บนเครื่องนั้น ส่วนการตั้งค่าของโปรเจกต์จะอยู่ที่ .claude/settings.json ภายใน repository และจะมีลำดับความสำคัญสูงกว่าในไดเรกทอรีนั้น การตั้งค่าจะโหลดใหม่โดยอัตโนมัติ แต่การเปลี่ยนแปลงจะแสดงผลเมื่อมีการอัปเดตครั้งถัดไป เช่น เมื่อคุณส่งข้อความครั้งต่อไป

ทำไม statusline ของ Claude Code ถึงว่างเปล่า?

สาเหตุส่วนใหญ่เกิดจาก 4 ปัจจัยนี้ สคริปต์ขาดสิทธิ์ execute ทำให้เชลล์คืนค่า Permission denied และไม่มีข้อมูลส่งไปยัง stdout, ยังไม่ได้กดยอมรับกล่องโต้ตอบ workspace trust ทำให้ claude --debug บันทึก log เป็น Status line command skipped: workspace trust not accepted, disableAllHooks ถูกตั้งเป็น true ซึ่งเป็นการปิดใช้งาน statusline ภายใต้เงื่อนไขเดียวกัน หรือสคริปต์จบการทำงานด้วย exit code ที่ไม่ใช่ศูนย์ ทำให้บรรทัดนั้นว่างเปล่า ให้ทดสอบด้วยตนเองก่อนโดยตรวจสอบว่า echo '{}' | ~/.claude/statusline.sh ต้องแสดงผลลัพธ์ออกมา

JSON ของ statusline รวม git branch ไว้ด้วยหรือไม่?

ไม่รวม JSON จะเก็บสถานะของเซสชัน เช่น โมเดล, ไดเรกทอรีของ workspace, จำนวน context window และค่าใช้จ่าย ไม่มีข้อมูลใดที่รายงานเกี่ยวกับ git การแสดง branch บนแถบสถานะของคุณเกิดจากการที่สคริปต์ของคุณเรียกใช้ git branch --show-current เอง ให้ส่งค่าไดเรกทอรีจาก JSON ด้วย git -C "$DIR" เพื่อให้ branch ตรงกับไดเรกทอรีที่แถบสถานะกำลังแสดงอยู่เสมอ

statusline ทำให้เสีย token หรือทำให้เซสชันช้าลงหรือไม่?

ไม่เสีย token เพราะสคริปต์ทำงานในเครื่องและผลลัพธ์จะไม่ถูกส่งไปยังโมเดล ความเร็วขึ้นอยู่กับการจัดการของคุณ คำสั่งจะทำงานทุกครั้งที่มีข้อความจากผู้ช่วยโดยมี debounce ที่ 300 ms และ Claude Code จะยกเลิกการทำงานที่ค้างอยู่เมื่อมีการอัปเดตใหม่เข้ามา ดังนั้นสคริปต์ที่ใช้เวลาทำงานถึงหนึ่งวินาทีจะแสดงข้อความที่ล้าสมัย หลีกเลี่ยงการใช้ git status ใน repository ขนาดใหญ่ และให้แคชข้อมูลที่ช้าไว้ในไฟล์โดยใช้ session_id เป็นคีย์

ฉันจะแสดง statusline ที่แตกต่างกันในแต่ละเซิร์ฟเวอร์ได้อย่างไร?

ใช้สคริปต์ชุดเดียวและให้สคริปต์อ่านค่าจากเครื่องนั้นๆ สคริปต์ข้างต้นจะพิมพ์ $HOSTNAME โดยมี hostname -s เป็นค่าสำรอง ดังนั้นไฟล์เดียวกันที่คัดลอกไปยังทุกเครื่องจะระบุชื่อแต่ละเครื่องได้อย่างถูกต้อง และเทคนิคการใช้ checksum เพื่อกำหนดสีจะทำให้แต่ละ hostname มีสีเป็นของตัวเอง หากเซิร์ฟเวอร์ใดต้องการรูปแบบที่ต่างออกไป ให้ใส่บล็อก statusLine ไว้ในการตั้งค่าโปรเจกต์ของ repository ที่คุณทำงานบนเครื่องนั้น เนื่องจากค่าของโปรเจกต์จะทับซ้อนค่าของผู้ใช้สำหรับไดเรกทอรีนั้นๆ