Profesyonel CLI Yapıları
Bu yazıda CLI'ın ne olduğunu, neden hâlâ terminal kullanıldığını, profesyonel bir CLI'ın standart bir CLI'dan ne farkı olduğunu ve profesyonelliğin nasıl sağlanabileceği anlatılmaktadır.
CLI Nedir?
CLI, Türkçe adıyla Komut Satırı Arayüzü, kullanıcının bilgisayara metin tabanlı komutlar yazarak işletim sistemi veya yazılımlarla etkileşime girmesini sağlayan bir araçtır.
Neden Hâlâ Terminal Kullanıyoruz?
Grafik arayüzler her geçen gün daha gelişmiş hale gelse de terminal hâlâ vazgeçilmez. Bunun birkaç temel sebebi var:
- Hız ve Verimlilik: Bir dosyayı bulmak için pencereler arasında dolaşmak yerine tek satırlık bir komut çoğu zaman daha hızlıdır.
- Otomasyon ve Scripting: Terminalde çalıştırdığın her komut bir scripte dönüştürülebilir. Tekrarlanan işler tek tıkla yeniden çalıştırılabilir hale gelir.
- Uzak Erişim (SSH): Sunuculara erişmenin standart yolu hâlâ terminaldir. SSH ile uzaktaki bir makineye bağlanıp tüm yönetim işlemlerini yapabilirsin.
- Kaynak Tasarrufu: Grafik arayüz çalıştırmak RAM ve CPU tüketir. Terminal ise minimum kaynakla çalışır, özellikle sunucularda bu kritik bir avantajdır.
Profesyonel Bir CLI Farkı Nedir?
Peki herkesin yazdığı her CLI aynı kalitede mi? Tabii ki değil. Bir CLI'ın çalışıyor olması yetmez. Başkalarının da rahatça kullanabileceği, beklenmedik durumlarda çökmeyen, kendisini açıklayabilen bir araç ortaya koymaktır.
Standart bir CLI ile profesyonel bir CLI arasındaki farka bakalım:
Standart CLI
- Kişiseldir: Sadece yazan kişi nasıl çalıştığını, hangi parametreyi nereye yazacağını bilir.
- Kırılgandır: Beklenmedik bir girdi verildiğinde veya dosya bulunamadığında doğrudan "Error" verir ve çöker.
- Kapalı kutudur: Çalışırken ne yaptığını, ne kadarının bittiğini kullanıcıya söylemez.
Profesyonel CLI
- Standartlara uyumludur: POSIX kurallarına uyar, herkes nasıl kullanılacağını tahmin edebilir.
- Hata yönetimi güçlüdür: Dosya yoksa "Dosya Bulunamadı" der; çöküp anlamsız kod yığınları dökmez.
- Kullanıcı dostudur: Gerekirse renkli çıktılarla kritik hataları ve başarılı işlemleri ayırır. Kullanıcı işlemlerini kısayollarla kolaylaştırır.
- Genişletilebilirdir: Alt komut yapısı sayesinde (örneğin
git clone,git commit) karmaşık işleri düzenli bir hiyerarşide sunar.
Peki bu profesyonelliği nasıl yakalarız? İki temel başlık altında inceleyelim: standartlara uyum ve görsellik.
Profesyonel CLI Tasarım İlkeleri
Profesyonelliğin ilk şartı standartlara uygun olmaktır. Bu standartların başında POSIX gelir.
Standartlara Uyumluluk (POSIX)
Üretilen tool'un Linux ekosistemiyle uyumlu olabilmesi için POSIX standartlarına uygun olması gerekmektedir. Başlıca POSIX standartları şunlardır:
- Komut satırı her zaman
-ile başlamalıdır. Örneğin-h,--helpgibi. - Kısa seçenekler tek bir karakterden oluşmalıdır. Help için
-h, verbose için-vgibi. - Argüman ayrımı net olmalıdır. Options ve operands birbirinden ayrılmalıdır. Örneğin:bashBurada
nmap -p 80 192.168.1.100-p 80bir option,192.168.1.100ise operand'dır. İkisinin görevi farklıdır ve bu ayrım net şekilde yapılmalıdır.
Bu kurallara uyulduğunda, yazılan tool'u ilk defa gören biri bile --help yazıp nasıl kullanacağını çıkarabilir. Çünkü dünyanın geri kalanındaki profesyonel tool'larla aynı standartlar kullanılmıştır.
CLI Nasıl Görsellik Kazanır?
Terminal denilince akla siyah ekranda beyaz yazılar gelir ama modern CLI'lar bundan çok daha fazlasıdır. Renkli çıktılar, tablolar ve özelleştirilmiş font'lar ile kullanıcı deneyimi ciddi ölçüde iyileşir.
Python için Rich kütüphanesi kullanılır. Bu kütüphane hata mesajlarını özelleştirme, verileri tabloda gösterme ve yazı fontlarını özelleştirme gibi özellikleri CLI uygulamalarına görsellik sağlar. Go dili için ise BubbleTea kütüphanesi aynı işlemleri yapılmasına olanak tanır.
Görselleştirme Örnekleri:
- Görsel Geri Bildirim: Ansi colors yardımıyla CLI’ya renkli bir görsel arayüz kazandırılmaktadır. Ansi kaçış karakterleri kullanılarak hem metin hem de arka planda renkli bir kullanış sağlar.
\u001bile bir kaçış karakteri yazılır. Bu sayede terminale bir yazı değil de bir komut gönderildiği iletilir.[48;5ayarı ile arka planın renginde değişiklik yapılacağı anlamına gelir. Aynı ayar metin rengi içinse38dir. Code parametresiyle rengin bit kodu,0mile de terminalin tamamının renkli olmasının önüne geçilip sadece belirtilen kısmın renkli olacağını söyler. - İlerleme takibi: Terminal üzerinde yapılan uzun süreli işlemlerde ilerleme takibini kolaylaştırmak için progress bar kullanılır. Bunun temel amacı kullanıcı uzun sürecek işlem yaptığında yapılan işlemin ne kadarının dolduğunu tıpkı hareket eden bir görünüm verir. Kare blok, shades gray shades black gibi seçeneklerle process bar’a görsellik kazandırılır. Process bar'da kalan süre yapılan işlemin yüzdesi ve kaç veride işlem yapıldığı ve kaçının kaldığı gösterilir.
- Tablolama: Bu bölümde de doğrudan tablo kullanılan durumlarda cli üzerinden tabloların okuması kolaylaştırılır.
- Sub-Command Yapısı: Bu yapının temel amacı karmaşıklığı yönetmektir. Tek bir devasa aracı kullanmak yerine fonksiyonel alt komutlar ile büyük bir aracın birbirinden farklı fonksiyonları kolayca kullanılabilir. Bu yapı genelde Ana araç (Entrypoint) + Aksiyon (Command) + Seçenekler(Options) şeklindedir. Örneğin
git commit -m "Altay"buna bir örnektir. Git gibi büyük bir aracın içindeki birçok fonksiyondan sadece commit kullanılmış ve bu da kullanım kolaylığı sağlamıştır.
Argüman Yönetim Araçları
Ayrıca cli’da argüman yönetimini kolaylaştıran birçok araç da vardır. Bu yazıda Argparse, Click ve Flag gibi arayüzlere değinelim:
- Flag:
- Sadelik: Sadece birkaç parametre alacak küçük bir scraper yazıyorsanız mantıklı bir seçimdir.
- POSIX standartlarına (uzun/kısa argüman ayrımı gibi) tam uyum sağlamaz, biraz daha kısıtlıdır.
- Argparse:
- Standart Kütüphane: Python yüklü olan her cihazda (Linux sunucular, SOC ortamları vb.) ekstra hiçbir şey yüklemeden (
pip installyapmadan) çalışır. - Güvenlik Odaklı: İnternet erişimi kısıtlı izole ortamlarda veya olay müdahalesi (Incident Response) sırasında araç geliştirmek için idealdir.
- Kontrol: Her parametre üzerinde tam kontrol sağlar ama kod satırı sayısı biraz uzayabilir.
- Standart Kütüphane: Python yüklü olan her cihazda (Linux sunucular, SOC ortamları vb.) ekstra hiçbir şey yüklemeden (
- Click (The Modernist):
- Decorator (
@) yapısını kullanarak parametreleri fonksiyonların hemen üzerine tanımlar. Bu da kodun okunabilirliğini artırır. - Alt Komut Ustası:
git status,git commitgibi iç içe geçmiş (nested) yapıları kurmak argparse'a göre çok daha kolaydır. - Kullanıcı Dostu: Terminalde otomatik yardım menüleri ve hata mesajları konusunda çok daha iyi çıktılar verir.
- Decorator (
Hata Yönetimi: Karmaşadan Kaçınmak
Profesyonel bir CLI, kullanıcıya anlamsız kod yığınları sunmak yerine süreci kontrol altında tutar.
- Traceback Kirliliği: Standart araçlar bir hata ile karşılaştığında doğrudan sistem hata çıktılarını (örneğin Python'daki
IndexError) terminale döker. Bu hem kafa karıştırıcıdır hem de profesyonel bir araca yakışmaz. - Anlamlı Mesajlar: Profesyonel bir araç, hatayı yakalayıp kullanıcıya "Dosya Bulunamadı" veya "Şu argüman eksik" gibi anlaşılır geri bildirimler verir.
- Exit Codes (Çıkış Kodları): Programın nasıl sonlandığını sisteme bildirmek otomasyon için kritiktir. Örneğin genellikle her şey yolundaysa
0, bir aksilik varsa (yanlış argüman, dosya eksikliği vb.)1kodu döndürülür.
Loglama: Görünmez Kayıtlar
Program beklenen sonucu vermediğinde veya arka planda neler döndüğünü anlamak gerektiğinde loglama devreye girer. İyi bir log kaydı şu bileşenleri içermelidir:
- Timestamp: Olayın tam olarak ne zaman gerçekleştiği (Örn:
2026-04-18 10:30:15). - Log Level: Mesajın önem derecesi (
INFO,WARNING,ERROR,DEBUG). - Mesaj: Olayın kısa ve öz açıklaması.
Kullanıcı Dostu Terminal ve CLI Deneyimi
Bir aracın sadece çalışması yetmez; kullanıcının işini kolaylaştırması ve görsel geri bildirim sağlaması gerekir.
- Tab Tamamlama (Auto-Completion): Kullanıcının komutları veya dosya yollarını yazarken Tab tuşuyla hızlıca tamamlayabilmesi, kullanıcı deneyimini bir üst seviyeye taşır.
- İlerleme Çubukları (Progress Bar) ve Spinner: Uzun süren işlemlerde aracın "donmuş" gibi görünmesini engellemek için kullanılır. İşlemin yüzde kaçının bittiğini veya devam ettiğini görsel olarak gösterir.
- Ok Tuşları: Menüler arasında gezinmek veya geçmiş komutlara erişmek için ok tuşlarının desteklenmesi, CLI aracını daha interaktif hale getirir.
Demo: Program Çalışıyor mu?
Buraya kadar anlatılanların pratikte ne anlama geldiğini görmek için küçük bir örnek üzerinden ilerleyelim. Elimizde, kendisine verilen dosya üzerinde işlem yapan basit bir script olsun: sil.py.
Scriptin ilk hâli, çoğu kişisel araçta olduğu gibi argümanı doğrudan sys.argv üzerinden alır:
import sys
dosya_adi = sys.argv[1]Bu script çalışır; ancak yalnızca her şey yolunda gittiğinde. Kullanıcı dosya adını yazmayı unuttuğu anda terminale şu çıktı düşer:
Traceback (most recent call last):
File "C:\Users\...\sil.py", line 4, in <module>
dosya_adi = sys.argv[1]
IndexError: list index out of range
Bu çıktı, aracı yazan kişi için bir ipucudur ama onu ilk kez kullanan biri için hiçbir anlam taşımaz. Kullanıcı ne yanlış yaptığını, aracı nasıl doğru çalıştıracağını buradan öğrenemez. Yukarıda bahsedilen "traceback kirliliği" tam olarak budur.
Aynı script argparse ile yeniden yazıldığında ise çıktı şu hâle gelir:
usage: sil.py [-h] dosya
sil.py: error: the following arguments are required: dosya
Aradaki fark tek bir satırdan çok daha fazlasıdır:
- Kullanıcıya neyin eksik olduğu açıkça söylenir:
dosyaargümanı. - Kullanımın doğru biçimi (
usage: sil.py [-h] dosya) doğrudan gösterilir. -hseçeneğinin var olduğu ima edilir; kullanıcıpython sil.py -hyazarak aracın tüm parametrelerini görebilir.- Program çökerek değil, kontrollü şekilde sonlanır ve sisteme bir çıkış kodu bildirir. (Argparse bu tür kullanım hatalarında geleneksel olarak
2, kendi yazdığımız hata bloklarında ise genellikle1döndürülür; başarılı çalışmada0'dır.)
Çıkış kodunun döndüğünü doğrulamak da basittir. Linux tarafında echo $?, PowerShell tarafında $LASTEXITCODE komutu son çalışan programın çıkış kodunu verir. Bu değer, aracın bir script veya pipeline içinde kullanılabilmesinin temel şartıdır: otomasyon, aracın başarılı olup olmadığını ekrandaki yazıdan değil, bu kodtan anlar.
Sessiz Program Problemi
Peki argümanları doğru verdik ve program hatasız çalıştı. Ekranda şunu görüyoruz:
PS C:\Users\...\Desktop> python sil.py
sonuclar:Program çöktü mü, hâlâ çalışıyor mu, yoksa işini bitirdi de sonuç mu bulamadı? Kullanıcı bunu bilemez. Teknik olarak her şey doğrudur ama araç, kullanıcıya hiçbir şey anlatmamaktadır. Bu da yazının başında bahsedilen "kapalı kutu" davranışıdır.
Profesyonel bir araç bu boşluğu şu yollarla doldurur:
- İşlem başlarken bilgi verir: "Taranıyor: 200 kayıt" gibi tek bir
INFOsatırı bile belirsizliği ortadan kaldırır. - Uzun işlemlerde progress bar veya spinner gösterir: Böylece aracın donmadığı, çalışmaya devam ettiği görülür.
- İşlem sonunda özet verir: "3 kayıt işlendi, 0 hata" gibi kapanış satırı, sonucun boş olmasıyla programın çalışmamasını birbirinden ayırır.
- Arka planda log tutar: Ekranda görünmeyen ayrıntılar (
DEBUGseviyesi) log dosyasına yazılır; sorun çıktığında geriye dönüp bakılacak bir kayıt olur.
Kısacası demo bize şunu gösterir: bir programın "çalışıyor olması" ile "kullanılabilir olması" aynı şey değildir. Aradaki farkı kapatan şey, bu yazı boyunca anlatılan standartlar, hata yönetimi, loglama ve görsel geri bildirimdir.
Sonuç
Bir CLI aracı yazmak zor değildir; birkaç satır kod ve bir sys.argv çağrısı çoğu işi görür. Zor olan, o aracı kendi bilgisayarımızın dışına çıkarabilmektir. Bir başkasının makinesinde, bir sunucuda, bir SOC ortamında veya bir olay müdahalesinin ortasında çalışacak araç; kendini açıklayan, hata verdiğinde ne olduğunu söyleyen, ne yaptığını gösteren ve otomasyona dahil edilebilen bir araç olmak zorundadır.
Yazı boyunca anlatılanları kısa bir kontrol listesine indirgersek, profesyonel bir CLI'ın sağlaması gereken maddeler şunlardır:
- [ ] POSIX'e uygun argüman yapısı ve çalışan bir
--helpmenüsü - [ ] Karmaşıklığı yöneten alt komut (sub-command) hiyerarşisi
- [ ] Argparse, Click veya Flag gibi bir argüman yönetim katmanı
- [ ] Traceback yerine anlamlı hata mesajları ve doğru exit code'lar
- [ ] Timestamp, log level ve mesaj içeren düzgün bir loglama altyapısı
- [ ] Renk, tablo, progress bar ve tab tamamlama ile desteklenmiş kullanıcı deneyimi
Bu maddelerin her biri tek başına küçük bir detay gibi görünür. Ancak hepsi bir araya geldiğinde, ortaya sadece "çalışan bir script" değil, başkalarının da güvenerek kullanabileceği bir araç çıkar. Aradaki fark da tam olarak budur.

