Terminalde saatler geçiriyorsunuz, onlarca komut yazıyorsunuz ve bir süre sonra “az önce o komutu nasıl yazmıştım?” diye kendinizi başa sarıyor buluyorsunuz. Bu durum her sysadmin’in hayatında defalarca yaşanır. İşte tam bu noktada bash’in geçmiş yönetimi devreye giriyor. Doğru kullanıldığında bu özellik, terminal verimliliğinizi ciddi ölçüde artırıyor ve aynı komutları tekrar tekrar yazmaktan kurtarıyor.
Bash History Nedir ve Nasıl Çalışır?
Bash, yazdığınız her komutu bellekte tutar ve oturumu kapattığınızda bunları bir dosyaya yazar. Varsayılan olarak bu dosya ~/.bash_history yoludur. Sistem yeniden başlatılsa bile geçmiş komutlarınıza erişebilirsiniz çünkü her şey bu dosyaya kaydedilir.
Geçmiş mekanizmasının arkasında birkaç önemli değişken çalışır:
- HISTFILE: Geçmiş komutların yazıldığı dosyanın yolu
- HISTSIZE: Bellekte tutulacak maksimum komut sayısı (aktif oturum için)
- HISTFILESIZE: Dosyaya yazılacak maksimum satır sayısı
- HISTCONTROL: Hangi komutların kaydedileceğini kontrol eder
- HISTIGNORE: Kaydedilmeyecek komut kalıplarını belirler
- HISTTIMEFORMAT: Komutların zaman damgasıyla kaydedilmesini sağlar
Varsayılan ayarlarda HISTSIZE genellikle 500 veya 1000 olarak gelir. Yani 1000 komuttan sonrası silinmeye başlar. Bu değerleri artırmak mümkün ve büyük ortamlarda kesinlikle tavsiye edilir.
Temel history Komutu Kullanımı
En basit kullanımıyla history komutu tüm geçmiş listesini ekrana döker:
history
Bu çıktı şöyle görünür:
995 ls -la /var/log
996 tail -f /var/log/syslog
997 systemctl status nginx
998 grep "error" /var/log/nginx/error.log
999 vim /etc/nginx/nginx.conf
1000 systemctl reload nginx
Her satırda solda bir numara, sağda ise komut yer alır. Bu numaraları kullanarak doğrudan komut çalıştırabilirsiniz.
Belirli Sayıda Komut Görmek
Tüm listeyi görmek yerine son N komutu görmek için:
history 20
Bu komut sadece son 20 girişi listeler. Yoğun çalışma sırasında bu çok daha kullanışlıdır.
Numara ile Komut Çalıştırma
Geçmiş listesinde 998 numaralı komutu tekrar çalıştırmak için:
!998
Ya da en son çalıştırdığınız komutu tekrar çalıştırmak için:
!!
Bu özellikle sudo ile çalışırken çok işe yarar. Bir komutu sudo olmadan çalıştırdınız ve “Permission denied” aldınız:
systemctl restart nginx
# Permission denied
sudo !!
# sudo systemctl restart nginx olarak çalışır
Belirli Bir Metinle Başlayan Son Komutu Çalıştırma
Harfle başlayan arama için ! işaretini kullanabilirsiniz:
!grep
Bu, geçmişte en son çalıştırdığınız grep ile başlayan komutu çalıştırır. Dikkatli kullanın çünkü onay istemez, direkt çalıştırır.
Daha güvenli bir alternatif olarak önce ne çalıştıracağınızı görmek isterseniz:
!grep:p
Sonundaki :p (print) sayesinde komut ekrana yazdırılır ama çalıştırılmaz. Böylece doğruluğunu kontrol edebilirsiniz.
Geçmişte Arama: grep ile Filtreleme
Uzun bir geçmiş listesinde belirli bir komutu bulmak için grep ile filtreleyebilirsiniz:
history | grep "nginx"
history | grep "docker run"
Gerçek dünya senaryosu: Bir hafta önce çalıştırdığınız uzun bir rsync komutunu aramak istiyorsunuz:
history | grep "rsync" | grep "backup"
Bu şekilde birden fazla anahtar kelimeyle daraltma yapabilirsiniz. Çıktıya bakıp doğru komutu bulduğunuzda numarasıyla çalıştırırsınız.
Ctrl+R ile Interaktif Arama
İşte bu özellik gerçekten hayat kurtarıcı. Ctrl+R tuş kombinasyonu, geçmiş komutlar arasında geriye doğru interaktif arama başlatır. Buna “reverse-i-search” denir.
Ctrl+R’ye bastığınızda prompt şöyle değişir:
(reverse-i-search)`':
Buraya yazmaya başladığınızda bash en son kullandığınız eşleşen komutu anlık olarak gösterir. Örneğin “nginx” yazdığınızda:
(reverse-i-search)`nginx': systemctl reload nginx
Birkaç önemli kullanım ipucu:
- Enter: Bulunan komutu çalıştırır
- Ctrl+R: Bir önceki eşleşmeye geçer (aynı arama terimi için daha eski sonuçlara bakar)
- Ctrl+G veya Escape: Aramadan çıkar, komutu çalıştırmaz
- Sağ ok tuşu: Komutu prompt’a yapıştırır ama çalıştırmaz, düzenleme imkanı tanır
Sağ ok tuşuyla düzenleme özelliği çok kritik. Diyelim ki şu komutu buldunuz:
(reverse-i-search)`find': find /var/log -name "*.log" -mtime +30 -delete
Bu komutu çalıştırmadan önce /var/log yerine /home yazmak istiyorsunuz. Sağ ok tuşuna basıp komutu prompt’a alıyorsunuz, sonra düzenleyip çalıştırıyorsunuz. Bu iş akışı inanılmaz derecede pratik.
Ctrl+S ile İleri Arama
Az bilinen bir özellik: Ctrl+S tuş kombinasyonu ileriye doğru arama yapar. Yani Ctrl+R ile geçmişe giderken Ctrl+S ile öne doğru dönebilirsiniz. Ancak çoğu terminal emülatöründe Ctrl+S terminal akışını durdurur (XON/XOFF flow control). Bu sorunu çözmek için:
stty -ixon
Bu komutu ~/.bashrc dosyanıza eklerseniz Ctrl+S ile terminal donması problemini çözer ve ileri yönlü aramayı aktif edersiniz.
History Ayarlarını Özelleştirme
Varsayılan ayarlar çoğu durumda yetersiz kalır. İşte gerçekten kullanılabilir bir geçmiş konfigürasyonu:
# ~/.bashrc veya ~/.bash_profile dosyasına ekleyin
# Geçmiş boyutunu artır
HISTSIZE=10000
HISTFILESIZE=20000
# Zaman damgası ekle
HISTTIMEFORMAT="%Y-%m-%d %H:%M:%S "
# Tekrar eden ve boşlukla başlayan komutları kaydetme
HISTCONTROL=ignoreboth
# Bu komutları geçmişe kaydetme
HISTIGNORE="ls:ls -la:ll:pwd:exit:clear:history"
# Geçmişi her komuttan sonra hemen yaz
PROMPT_COMMAND="history -a; history -c; history -r; $PROMPT_COMMAND"
Değişiklikleri uygulamak için:
source ~/.bashrc
Bu konfigürasyonda birkaç kritik nokta var. HISTCONTROL=ignoreboth iki şey yapar: ignoredups (tekrar eden komutları tek sefer kaydeder) ve ignorespace (boşlukla başlayan komutları kaydetmez). Şifre içeren bir komutu geçmişe düşürmemek için başına boşluk koyabilirsiniz:
mysql -u root -pGizliSifre123
Başındaki boşluğa dikkat edin. Bu komut geçmişe kaydedilmez.
PROMPT_COMMAND satırındaki ayar ise özellikle birden fazla terminal penceresiyle çalışanlar için kritik. Normalde bash geçmişi sadece oturum kapandığında dosyaya yazar. Bu ayarla her komuttan sonra geçmiş anında dosyaya yazılır ve diğer oturumlar tarafından okunabilir hale gelir.
Zaman Damgalı Geçmiş
HISTTIMEFORMAT değişkenini ayarladıktan sonra geçmiş görünümü şöyle değişir:
history 5
996 2024-01-15 14:23:11 tail -f /var/log/syslog
997 2024-01-15 14:25:33 systemctl status nginx
998 2024-01-15 15:10:02 grep "error" /var/log/nginx/error.log
999 2024-01-15 15:12:45 vim /etc/nginx/nginx.conf
1000 2024-01-15 15:15:18 systemctl reload nginx
Bu özellik özellikle post-incident analizlerde son derece değerli. “Bu değişikliği tam olarak ne zaman yaptım?” sorusunun cevabını vermenizi sağlar. Bir prodüksiyon sunucusunda bir şeyler patladığında ve siz “en son ne yaptım” diye sorduğunuzda zaman damgaları hayat kurtarır.
Geçmiş Dosyasını Doğrudan Okumak
Bazen history komutu yerine doğrudan dosyayı okumak daha pratik olabilir:
cat ~/.bash_history
Ya da belirli bir tarihteki komutları aramak için (HISTTIMEFORMAT ayarlıysa):
grep -A1 "2024-01-15 14" ~/.bash_history
Birden fazla sunucunuzun geçmiş dosyalarını karşılaştırmak istediğinizde de bu yöntem kullanışlıdır:
# Uzak sunucudan geçmişi çek
ssh user@server "cat ~/.bash_history" | grep "docker"
Geçmişi Temizleme
Bazı durumlarda geçmişi temizlemeniz gerekebilir. Hassas bilgi içeren bir komutu yanlışlıkla yazdınız ve geçmişten silmek istiyorsunuz:
# Belirli bir satırı sil (örneğin 999 numaralı komut)
history -d 999
# Tüm geçmişi bellekten temizle
history -c
# Bellekten temizle ve dosyayı da üzerine yaz
history -c && history -w
Dikkat: history -c sadece mevcut oturumun belleğini temizler. Dosyayı da temizlemek için history -w ile birlikte kullanmanız gerekir.
Birden Fazla Terminal Oturumu ile Çalışma
Gerçek dünyada genellikle birden fazla terminal penceresi açık olur. Bu durumda geçmiş yönetimi biraz karmaşıklaşır. Bash varsayılan davranışında her oturum kendi geçmişini bellekte tutar ve kapandığında dosyaya yazar. Son kapanan oturum kazanır, diğerlerinin bazı komutları kaybolabilir.
Bu sorunu çözmek için bahsettiğimiz PROMPT_COMMAND yöntemine ek olarak şu yaklaşımı da kullanabilirsiniz:
# Her komuttan sonra geçmişe ekle (üzerine yazma)
shopt -s histappend
# Geçmişi her prompt gösteriminde yeniden yükle
PROMPT_COMMAND="history -a; history -n"
shopt -s histappend ayarı çok önemli. Bu olmadan bash, oturum kapandığında mevcut bellekteki geçmişi dosyaya yazar (overwrites). Bu ayarla ise ekler (appends). Yani farklı oturumların geçmişleri birbirini ezmez.
Gelişmiş Kullanım: fzf ile Fuzzy Search
Standart Ctrl+R’nin ötesine geçmek istiyorsanız fzf aracı mükemmel bir alternatif sunar. fzf (fuzzy finder) kurulu değilse:
# Ubuntu/Debian
sudo apt install fzf
# RHEL/CentOS/Rocky
sudo dnf install fzf
# MacOS
brew install fzf
fzf’yi bash history ile entegre etmek için ~/.bashrc dosyasına ekleyin:
# fzf bash entegrasyonu
[ -f /usr/share/doc/fzf/examples/key-bindings.bash ] &&
source /usr/share/doc/fzf/examples/key-bindings.bash
Kurulumdan sonra Ctrl+R artık çok daha güçlü bir arayüz açar. Fuzzy search sayesinde tam eşleşme aranmaz, yazdığınız karakterler komut içinde herhangi bir yerde bulunabilir. Örneğin “ngnx rld” yazarak “systemctl reload nginx” komutunu bulabilirsiniz.
Gerçek Dünya Senaryoları
Senaryo 1: Uzun bir docker run komutunu bulmak
Bir container başlatmak için 3 satırlık bir docker run komutu yazmıştınız. Port yönlendirmeleri, environment değişkenleri, volume mount’ları vardı. Bunu tekrar yazmak yerine:
history | grep "docker run" | grep "8080"
Birkaç anahtar kelimeyle daraltma yapıp numarasıyla direkt çalıştırırsınız.
Senaryo 2: Hatalı bir config değişikliğinin zamanını bulmak
Prodüksiyon sunucusunda nginx bir saat önce çalışmayı bıraktı. Geçmişe bakıyorsunuz:
history | grep -E "nginx|conf|reload|restart"
Zaman damgalarıyla birlikte hangi değişikliğin ne zaman yapıldığını görebilirsiniz.
Senaryo 3: Sık kullanılan ama hatırlanması güç komutları
openssl ile sertifika detaylarını görmek için kullandığınız komutu hiç hatırlamıyorsunuz:
history | grep "openssl x509"
Önceki kullanımı bulup çalıştırırsınız. Bir dahaki sefere de aynısını yaparsınız, ezberlemek zorunda kalmazsınız.
Senaryo 4: Takım arkadaşının yaptığı bir işlemi anlamak
Shared bir sunucuda başka birinin bıraktığı durumu anlamak için (uygun izinleriniz varsa):
# Root geçmişine bakmak
sudo cat /root/.bash_history | tail -50
# Ya da başka bir kullanıcının geçmişi
sudo cat /home/deployer/.bash_history | grep "systemctl"
History ile Otomasyon ve Scripting
Geçmişten komut çıkarıp script haline getirmek de sık başvurulan bir yöntem:
# Son 10 komuttan script oluştur
history 10 | awk '{$1=""; print}' | tail -n +2 > hizli_script.sh
chmod +x hizli_script.sh
Bu yaklaşım özellikle interaktif olarak test ettiğiniz ve işe yarayan komut dizisini sonradan script haline getirmek istediğinizde çok pratik.
Güvenlik Notları
Geçmiş yönetimi konusunda güvenlik açısından dikkat edilmesi gereken birkaç nokta var:
- Şifreler ve API anahtarları asla komut satırı argümanı olarak yazılmamalı. Yazılmak zorundaysanız başına boşluk koyun veya
HISTIGNOREile o komut kalıbını hariç tutun. - Paylaşılan sunucularda
~/.bash_historydosyasının izinlerini kontrol edin. Sadece sahibi okuyabilmeli:chmod 600 ~/.bash_history - Sudo ile çalışırken root’un geçmiş dosyası ayrı tutulur.
/root/.bash_historydosyasını düzenli kontrol etmek iyi bir alışkanlık. - Bazı güvenlik politikalarında merkezi geçmiş loglaması zorunlu tutulur. Bu durumda
PROMPT_COMMANDile geçmişi merkezi bir log sunucusuna gönderen çözümler kullanılabilir.
# Hassas komut kalıplarını geçmişe kaydetme
HISTIGNORE="*password*:*passwd*:*secret*:*token*:*apikey*"
Sonuç
Bash geçmiş yönetimi, ilk bakışta basit görünen ama derinleştikçe gerçekten güçlü bir araç seti sunar. history komutu, Ctrl+R ile interaktif arama, doğru konfigürasyon değişkenleri ve fzf gibi ek araçların kombinasyonu terminal verimliliğinizi dramatik biçimde artırır.
En önemli alışkanlık değişikliği şu: Bir komutu yazmadan önce iki saniye durup “bunu daha önce yazmış mıydım?” diye sormak. Ctrl+R ile hızlı bir arama çoğu zaman sizi uzun ve hatalı yazımlardan kurtarır.
~/.bashrc dosyanıza ekleyeceğiniz birkaç satır konfigürasyon, özellikle HISTSIZE, HISTTIMEFORMAT ve shopt -s histappend ayarları, günlük terminal kullanımınızı hemen iyileştirir. Zaman damgalı geçmiş ise özellikle prodüksiyon ortamlarında yapılan değişiklikleri takip etmek açısından vazgeçilmez hale gelir.
Terminale her oturduğunuzda geçmişinizin orada sizi beklediğini ve doğru kullandığınızda en iyi referans kaynağınız olduğunu unutmayın.