Claude Code statusLine ayarı ile sunucu bilgisi gösterme
Claude Code terminalinde hostname, dizin ve git bilgisi görüntülemek için statusLine ayarının nasıl yapılandırılacağını öğrenin. Yanlış sunucuda işlem yapmayı önleyin.
Claude Code durum satırı ne gösterir
Claude Code durum satırı, yazdığınız bir betiğin çıktısını görüntüleyen, komut isteminin altındaki bir satırdır. Bir statusLine bloğunu settings.json dosyasına ekleyip bir komuta yönlendirirsiniz. Claude Code bu komutu çalıştırır, oturum durumunu standart girdi (stdin) üzerinden JSON formatında gönderir ve komutun standart çıktıya (stdout) yazdığı her şeyi ekrana basar.
Sözleşmenin tamamı budur. Betiğiniz stdin üzerinden JSON okur ve stdout üzerinden metin yazdırır. Bu işlem makinenizde çalışır ve yazdırılan hiçbir veri modele gönderilmez; dolayısıyla token maliyeti oluşturmaz.
Tek bir projeye sahip bir dizüstü bilgisayarda bu sadece bir süslemedir. Üç sunucuda ise bir güvenlik önlemidir. Her Claude Code oturumu her terminalde aynı görünür; bu nedenle etiketsiz dört SSH penceresi, bir taşıma işleminin yanlış sunucuda gerçekleşmesine neden olabilir. Hostname ile başlayan bir durum satırı, bu tür hataları tamamen ortadan kaldırır.
settings.json dosyasındaki statusLine ayarının konumu
Bu ayarı, o makinedeki her proje için geçerli olan ~/.claude/settings.json konumundaki kullanıcı ayarlarınıza ekleyin. Bir depo içerisindeki .claude/settings.json konumunda bulunan proje ayarları da çalışır ve ilgili dizin için önceliklidir.
{
"statusLine": {
"type": "command",
"command": "~/.claude/statusline.sh"
}
}type her zaman "command" değerindedir. command değeri bir kabuk (shell) üzerinden çalıştırılır, bu nedenle bir betik yolu veya doğrudan bir komut olabilir. Herhangi bir betik yazmadan önce bağlantının çalıştığını doğrulayın:
{
"statusLine": {
"type": "command",
"command": "hostname -s"
}
}Claude Code uygulamasını başlatın ve bir mesaj gönderin. İstemi takip eden çubukta artık sunucunun kısa ana bilgisayar adı (hostname) görünür. Eğer boş kalıyorsa, sorun ayarda veya güven iletişim kutusundadır; betiğinizde değildir. Aşağıdaki "Durum çubuğu neden boş kalıyor" bölümünü okuyun.
Ağustos 2026 itibarıyla üç isteğe bağlı anahtar mevcuttur. padding karakter cinsinden yatay boşluk ekler ve varsayılan değeri 0'dur. refreshInterval, normal tetikleyicilere ek olarak komutu her N saniyede bir yeniden çalıştırır; minimum değer 1'dir ve bu ayar yalnızca satırda bir saat veya oturum boşta dururken değişen bir veri gösteriliyorsa gereklidir. hideVimModeIndicator, kendi betiğiniz zaten vim modunu işliyorsa yerleşik -- INSERT -- metnini gizler.
statusline betiği hangi verileri alır?
Bu sayfa dahil olmak üzere herhangi bir yerde okuduğunuz alan listesine güvenmeyin. Sürümünüzün gönderdiği gerçek nesneyi yakalayın. stdin içeriğini bir dosyaya kaydeden geçici bir betik yazın:
cat > ~/.claude/statusline-capture.sh <<'EOF'
#!/bin/bash
cat > /tmp/statusline-input.json
echo "captured"
EOF
chmod +x ~/.claude/statusline-capture.shstatusLine.command değerini bu dosyaya yönlendirin, bir oturum başlatın ve bir mesaj gönderin. Çubuk captured değerini okur. Şimdi neyin ulaştığına bakın:
jq . /tmp/statusline-input.jsonYapınız için tam şekle sahipsiniz ve bir güncelleme bir şeyi değiştirdiğinde bunu istediğiniz zaman tekrarlayabilirsiniz.
Ağustos 2026 itibarıyla belgelendiği üzere kararlı kısımlar, düz anahtarlar yerine iç içe geçmiş nesnelerdir. model, id ve display_name değerlerini tutar. workspace, current_dir ve project_dir değerlerini tutar: current_dir oturumun şu an bulunduğu yerdir, project_dir başlatıldığı yerdir ve çalışma dizini oturum ortasında değiştiğinde bu ikisi farklılaşır. En üst düzey cwd, workspace.current_dir ile aynı değeri taşır. context_window, token sayılarını ve önceden hesaplanmış bir used_percentage değerini tutar. cost, total_cost_usd ve süre sayaçlarını tutar. session_id, oturum süresince kararlıdır ve oturumlar arasında benzersizdir; bu durum daha sonra önbelleğe alma işlemleri için önemlidir.
Üç kural, bir betiği şema değişiklikleri boyunca canlı tutar.
Bazı anahtarlar null değil, yoktur. vim, agent, pr, worktree ve effort yalnızca ilgili özellik etkin olduğunda görünür. Vim modu kapalıyken .vim.mode değerini jq -r ile okumak, değişmez null dizisini yazdırır ve çubuğunuz okuyucuya null değerini gösterir. Her seçiciye // empty ekleyin, böylece eksik bir anahtar hiçbir şey yazdırmaz.
Bazı değerler başlangıçta null değerindedir. context_window.used_percentage ve context_window.current_usage, ilk API yanıtından önce null değerindedir ve current_usage, bir sonraki çağrı onu yeniden doldurana kadar /compact sonrasında tekrar null değerine döner. Bu nedenle çubuk üzerindeki bir bağlam yüzdesi // 0 gerektirir, aksi takdirde her oturumun ilk saniyelerinde null değerini okur. Bu sayıyı çubuğa koymadan önce, bağlam penceresinin aslında nasıl dolduğunu bilmek faydalıdır.
Git dalı JSON içinde yer almaz. Hiçbir alan bunu raporlamaz. Çubuğunuzdaki herhangi bir dal, betiğinizin bizzat git komutunu çalıştırmasından gelir.
Hata vermek yerine kademeli olarak işlevini yitiren bir durum satırı betiği
Bu, kopyalayıp yapıştırabileceğiniz sürümdür. Sunucu adını, çalışma dizinini, git dalını ve model adını yazdırır. Her alanın bir yedeği vardır, bu nedenle boş bir JSON nesnesi bile kullanılabilir bir satır üretir.
#!/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"Her okuma işlemi, // empty ekleyen field üzerinden gerçekleşir; bu sayede yeniden adlandırılan veya kaldırılan bir anahtar boş bir dizge üretir ve bir sonraki satır varsayılan değeri sağlar. Dizin bilgisi workspace.current_dir üzerinden cwd'e, oradan da $PWD'ye yedeklenir. Dal bilgisi doğrudan git yerine git -C "$DIR" kaynağından gelir, böylece dal bilgisi her zaman çubuğun gösterdiği dizinle eşleşir.
Dosyayı kaydedin ve ardından çalıştırılabilir hale getirin:
chmod +x ~/.claude/statusline.shÇalıştırma biti isteğe bağlı değildir. Claude Code komutu bir kabuk üzerinden çalıştırır, bu nedenle +x içermeyen bir betik Permission denied hatasıyla başarısız olur, standart çıktı üretmez ve satır görünür bir hata olmaksızın boş kalır.
jq komut satırında JSON ayrıştırması yapar ve yeni kurulmuş bir Ubuntu sunucusunda yüklü değildir:
sudo apt update && sudo apt install -y jqArdından, yukarıdaki ilk settings.json bloğunu kullanarak ayarı betiğe yönlendirin.
Betik güvenilirliğini test etme
Betiği manuel olarak iki kez çalıştırın. İlk olarak normal bir oturum nesnesi ile:
echo '{"model":{"display_name":"Opus"},"workspace":{"current_dir":"/srv/api"},"session_id":"t1"}' | ~/.claude/statusline.shSunucu adını, ardından /srv/api ve Opus değerlerini alırsınız. Herhangi bir dal görünmez, çünkü makinenizdeki /srv/api muhtemelen bir git deposu değildir.
İkinci olarak, insanların genellikle atladığı bozulma (degradation) testi:
echo '{}' | ~/.claude/statusline.shBoş bir nesne, şema değişikliğinin size sunabileceği en kötü durumdur. Satır yine de çıktı verir: sunucu adı, $PWD üzerinden mevcut dizin ve model adının gelmesi gereken yerde claude kelimesi. Hiçbir şey çökmez ve hiçbir yerde null çıktısı oluşmaz. Bu testi geçen bir betik, bir alanın yeniden adlandırılması durumunda çalışmaya devam eder; çünkü betiğiniz için yeniden adlandırılmış bir alan ile eksik bir alan aynı olaydır.
Ne görmeniz gerektiği
Durum satırı, yerleşik alt bilgi rozetlerinin üzerinde kendi satırında oluşturulur ve bunların yerini almaz. Çalışan bir kurulumda bu tek bir satırdır: camgöbeği renginde kısa ana makine adı, ardından ev dizininizin ~ olarak daraltıldığı çalışma dizini, dizin bir git deposu olduğunda sarı renkte dal adı ve ardından soluk renkte model adı. web-01 ~/api main Opus ifadesine yakın, bu dört parçanın renklendirilmiş olduğu bir görünüm elde edilir.
Satır, bir oturum başladığında (yeniden başlatma dahil), yeni bir asistan mesajı geldiğinde, /compact tamamlandıktan sonra, izin modu değiştiğinde, vim modu değiştirildiğinde ve eğer ayarladıysanız bir refreshInterval işareti geldiğinde betiğinizi yeniden çalıştırır. Güncellemeler 300 ms ile sınırlandırılmıştır (debounced), bu nedenle bir dizi değişiklik betiği yalnızca bir kez çalıştırır. Çubuk, otomatik tamamlama, yardım menüsü ve izin istemleri sırasında gizlenir, ardından geri döner.
Sunucu adının neden en başta yer alması gerektiği
Birden fazla sunucuda ajan çalıştırdığınızda, bulunduğunuz yeri size yalnızca terminal söyler ve terminaller yanıltıcı olabilir. Bir tmux bölmesi içinden ikinci bir ssh bağlantısı açtığınızda, pencere başlığı genellikle eski adı korur; çünkü başlık, yer değiştirdiğini asla öğrenemeyen bir kabuk tarafından ayarlanır. Claude Code'u bir VPS üzerinde ayrılmış bir tmux oturumunda çalışır durumda bırakıp bir gün sonra tekrar bağlandığınızda, ekrandaki hiçbir şey build sunucusunu üretim sunucusundan ayırmaz.
Durum satırı farklıdır çünkü bu satır, oturumun kendi verileri kullanılarak bizzat Claude Code tarafından, oturum bazında oluşturulur. Yanlış bir bölmeden devralınamaz veya yenilenmeyen bir kabuk istemi tarafından güncelliğini yitirmiş halde bırakılamaz. Satırda yazan şey, ajanın üzerinde dosya yazdığı sunucudur.
Her sunucuya kendi rengini atayın; böylece okumadan önce sunucuyu tanırsınız. LINE= atamasının üzerine eklenen iki satır:
CODE=$(printf '%s' "$HOST" | cksum | cut -d' ' -f1)
HOST_COLOR=$(printf '\033[%dm' "$((31 + CODE % 6))")Ardından ${CYAN} yerine ${HOST_COLOR} kullanın. cksum, sunucu adının bir sağlama toplamını (checksum) yazdırır; böylece belirli bir ad, 31 ile 36 arasındaki (kırmızıdan camgöbeğine kadar) aralıkta her zaman aynı renkle eşleşir. Aynı betiği her sunucuya kopyaladığınızda, her biri kendini etiketlemiş olur.
Dizin de aynı nedenle yerini hak eder. /srv/api ve /srv/api-staging, bir ssh komutunda tek tuş vuruşu kadar yakın, ancak etki bakımından koca bir olay (incident) kadar uzaktır. Model ve branch, genişliği hak eden diğer iki unsurdur: model hangi oturumu devam ettirdiğinizi söyler, branch ise ajanın main üzerine commit yapıp yapmayacağını belirtir.
Küçük bir ekran tüm bunları daha belirgin hale getirir, çünkü geri dönülebilecek bir pencere başlığı yoktur. Kurulumunuz bu şekildeyse, Claude Code'u telefondan yönetme konusuna göz atın.
Betik hızını koruyun
Betiğiniz her asistan mesajında çalışır ve yeni bir güncelleme geldiğinde Claude Code devam eden çalışmayı iptal eder. Bu nedenle yavaş bir betik, güncelliğini yitirmiş metinlerin görüntülenmesine veya hiç metin görüntülenmemesine neden olur.
Her jq çağrısı birkaç milisaniye sürer. git yavaşlayan kısımdır: büyük bir depoda ve soğuk önbellekte git status yüzlerce milisaniye sürebilir. Yukarıdaki betik, git status komutundan kasıtlı olarak kaçınır ve .git/HEAD dosyasını okuyup anında geri dönen git branch --show-current komutunu çağırır.
Daha ağır bir işlem eklerseniz, bunu bir dosyada önbelleğe alın ve birkaç saniyede bir yenileyin. Dosyayı oturuma göre anahtarlayın:
CACHE="/tmp/statusline-$(field '.session_id')"$$ yerine session_id kullanın. $$, betiğinizin her çağrıda farklı olan işlem kimliğidir (PID); bu nedenle bu kimliğe göre anahtarlanan bir önbellek asla isabet etmez ve her seferinde tam maliyeti ödersiniz. session_id tüm oturum boyunca sabittir ve oturumlar arasında farklılık gösterir; böylece iki farklı depodaki iki Claude Code oturumu birbirinin önbelleğe alınmış dal adını okuyamaz. Oturumlar tasarım gereği bu şekilde izole kalır; bu yüzden birinden diğerine iş aktarmak kasıtlı bir adım gerektirir, bu da bir Claude Code oturumundan diğerine mesaj gönderme işleminin amacını oluşturur.
Bilinmesi gereken bir diğer sınır: tput cols bir durum satırı (statusline) betiği içinde çalışmaz. Claude Code, betiğinizi terminale bağlamak yerine çıktıyı yakalar, bu nedenle genişlik algılamasının ölçecek bir verisi olmaz. Claude Code, v2.1.153 ve sonraki sürümlerde komutu çalıştırmadan önce COLUMNS ve LINES ortam değişkenlerini ayarlar; bu nedenle ne kadar çıktı yazdıracağınıza karar vermeniz gerektiğinde $COLUMNS değişkenini okuyun.
Durum çubuğunun neden boş kaldığı
Hiçbir şey görünmüyor. ls -l ~/.claude/statusline.sh ile çalıştırma iznini (execute bit) kontrol edin, ardından yukarıdaki örnek girdiyi kullanarak betiği manuel olarak çalıştırın. Eğer çıktı kabukta görünüyor ancak Claude Code içinde görünmüyorsa, oturumun ilk durum çubuğu çalıştırmasının çıkış kodunu ve stderr çıktısını kaydeden claude --debug ile başlayın.
Hata ayıklama günlüğü Status line command skipped: workspace trust not accepted diyor. Durum çubuğu bir kabuk komutu çalıştırır, bu nedenle kancalarla (hooks) aynı çalışma alanı güvenliği denetimine tabidir. O dizin için güven iletişim kutusunu onaylayana kadar komut çalışmaz. Bu durum, her yeni klonun Claude Code tarafından daha önce görülmemiş bir dizin olduğu VPS ortamlarında yaygındır. Claude Code'u o dizinde yeniden başlatın ve iletişim kutusunu onaylayın.
Her şey boş ve disableAllHooks ayarlı. settings.json içindeki "disableAllHooks": true, aynı kabuk yürütme denetimine tabi olduğu için durum çubuğunu da devre dışı bırakır. Bu ayarı kaldırın veya false olarak ayarlayın.
Satır null yazdırıyor. Bir jq seçicisi eksik veya null olan bir anahtara ulaştı ve jq -r, null değerini null karakterleri olarak yazdırır. Metin için // empty, sayılar için // 0 ekleyin.
Betiği düzenledikten hemen sonra satır boşalıyor. Sıfırdan farklı bir değerle çıkan veya hiçbir şey yazdırmayan bir komut, satırı boşaltır. Bunun yaygın nedeni, dal boş olduğunda 1 koduyla çıkan ve tüm betiğin çıkış kodunu etkileyen [ -n "$BRANCH" ] && LINE="..." gibi bir son satırdır. printf komutunu en sona koyun veya exit 0 ekleyin.
Kaçış kodları (escape codes) çubukta \e]8;; gibi düz metin olarak görünüyor. echo -e yerine printf '%b' kullanın. Tıklanabilir OSC 8 bağlantıları, bunları destekleyen bir terminal gerektirir; tmux veya SSH bu dizileri kaldırabilir, bu nedenle uzak bir sunucuda düz renk kullanmak daha güvenli bir tercihtir.
Satırın sağ tarafı kesiliyor. Sistem bildirimleri ve ayrıntılı mod (verbose-mode) belirteç sayacı, o satırı sağ taraftan paylaşır ve dar bir terminalde çakışma nedeniyle kayıp yaşanır. Çıktıyı kısa tutun. Çubuk üzerindeki bir sayı yerine kullanımın gerçek bir dökümü için Claude Code'un belirteçleri nasıl saydığına bakın.
FAQ
Claude Code durum çubuğu ayarı nerede bulunur?
settings.json içinde, type değeri "command" ve command değeri bir betik yolu veya kabuk komutu olarak ayarlanmış bir statusLine bloğu olarak yer alır. Kullanıcı ayarları ~/.claude/settings.json konumundadır ve o makinedeki her projeye uygulanır. Proje ayarları ise deponun içindeki .claude/settings.json konumundadır ve ilgili dizin için önceliklidir. Ayarlar kendiliğinden yeniden yüklenir, ancak bir değişiklik yalnızca bir sonraki mesajınız gibi bir güncelleme tetikleyicisiyle görünür hale gelir.
Claude Code durum çubuğum neden boş?
Neredeyse tüm durumlar dört nedenden kaynaklanır. Betikte çalıştırma izni (execute bit) eksiktir, bu nedenle kabuk Permission denied döndürür ve standart çıktıya (stdout) hiçbir şey ulaşmaz. Çalışma alanı güven iletişim kutusu onaylanmamıştır ve claude --debug, Status line command skipped: workspace trust not accepted günlüğünü tutar. disableAllHooks değeri true olarak ayarlanmıştır; bu da aynı kısıtlama altında durum çubuğunu devre dışı bırakır. Veya betik sıfır olmayan bir çıkış kodu döndürür, bu da satırı boş bırakır. Önce manuel olarak test edin: echo '{}' | ~/.claude/statusline.sh bir çıktı üretmelidir.
Durum çubuğu JSON verisi git dalını içeriyor mu?
Hayır. JSON; model, çalışma alanı dizinleri, bağlam penceresi sayıları ve maliyet gibi oturum durumunu taşır. İçinde git bilgisini raporlayan bir veri yoktur. Çubuğunuzdaki bir dal bilgisi, kendi betiğinizin git branch --show-current komutunu çağırmasından gelir. JSON'dan gelen dizini git -C "$DIR" ile iletin; böylece dal bilgisi her zaman çubuğun gösterdiği dizinle eşleşir.
Durum çubuğu token harcar mı veya oturumu yavaşlatır mı?
Token harcamaz, çünkü betik yerel olarak çalışır ve çıktısı asla modele gönderilmez. Hız sizin sorumluluğunuzdadır. Komut, her asistan mesajında 300 ms gecikme (debounce) ile çalışır ve Claude Code yeni bir güncelleme geldiğinde devam eden çalışmayı iptal eder; bu nedenle bir saniye süren bir betik eski metni gösterir. Büyük depolarda git status kullanmaktan kaçının ve yavaş olan her şeyi session_id anahtarıyla bir dosyada önbelleğe alın.
Her sunucuda farklı bir durum çubuğunu nasıl gösteririm?
Tek bir betik tutun ve makineyi okumasını sağlayın. Yukarıdaki betik, yedek olarak hostname -s ile $HOSTNAME değerini yazdırır; böylece her kutuya kopyalanan aynı dosya her birini doğru şekilde etiketler ve sağlama toplamı renk hilesi her ana bilgisayar adına kendi rengini verir. Eğer bir sunucu farklı bir düzen gerektiriyorsa, o kutuda üzerinde çalıştığınız deponun proje ayarlarına bir statusLine bloğu ekleyin; çünkü proje ayarları o dizin için kullanıcı ayarlarını geçersiz kılar.