Bash İpuçları – Daha Önceden Çalıştırılmış Komutlar
Bash ipuçları; Linux kullanıcılarının, özellikle de sistem yöneticilerinin işini oldukça kolaylaştırabilir. Bu kısayolların tamamını bilmek/kullanmak durumunda olmasanız da, bazılarının fazlasıyla işe yarayacağına eminim.
Bu yazıda, Bash’te daha önceden yazdığınız komutları tekrar çalıştırma, komut geçmişinde arama yapma, önceki komutları root yetkisiyle çalıştırma gibi Bash ipuçlarını inceleyeceğiz.
Bu yazıda yer alan ipuçları, “Bash” ile denenmiştir. Ancak kendi shell’lerinizde de deneyebilir veya aynı işleve sahip farklı bir kullanım olup olmadığını araştırabilirsiniz.
Gezinti Kısayolları
“Yukarı ok” tuşu ile daha önceden yazdığınız komutları tek tek görebilirsiniz. Komut geçmişinde geriye gittikten sonra, “aşağı ok” tuşu ile tekrar ileri gelebilirsiniz.
“CTRL+R” tuş kombinasyonu ile “geriye dönük arama (reverse search)” yapabilirsiniz. Bu sayede, bir kısmını hatırladığınız komutlar arasında gezebilir ya da uzun bir komutun sadece bir kısmını yazarak otomatik tamamlanmasını sağlayabilirsiniz.
ali@zion:~$ echo "Reverse search örneği"
Reverse search örneği
(reverse-i-search)`apt': sudo apt-get update && sudo apt-get upgrade -y
CTRL+R sonrasında, shell prompt’unuzda “(reverse-i-search)” ifadesini göreceksiniz. Devamında, aramak istediğiniz metni yazabilirsiniz (örneğin “apt”). Komut geçmişinizde yer alan ve içinde “apt” geçen en yeni komut, ekranınıza gelecektir. Şayet aradığınız komut bu değilse, tekrar CTRL+R kombinasyonunu kullanarak aramanızı daha eski komutlarda devam ettirebilirsiniz. Çalıştırmak istediğiniz komutu bulduğunuzda “Enter” tuşuna basarak bu komutu çalıştırabileceğiniz gibi, “sağ veya sol ok” tuşlarını kullanarak bu komutu çalıştırmadan önce düzenleme imkânı da bulabilirsiniz.
history
“history” komutu, komut geçmişinizi gösterir. Ekrana gelecek tam liste yerine, bu komutu “pipe |” ile “grep”e gönderebilirsiniz. Bu sayede manuel arama yapabilirsiniz.
ali@zion:~$ history | grep upgrade
134 sudo apt-get upgrade
215 pip install --upgrade pip
222 sudo pip install --upgrade pip
238 sudo apt-get upgrade
257 sudo apt-get update && sudo apt-get upgrade -y
262 sudo apt-get update && sudo apt-get upgrade -y
268 history | grep upgrade
Yukarıdaki komut ile; komut geçmişimizde, içerisinde “upgrade” kelimesi geçen komutları listeledik.
Ünlem İşaretli İfadeler
Ünlem işareti, Bash kullanırken sıklıkla başvurabileceğimiz karakterlerden. Komut geçmişinden belirli bir komutu seçip çalıştırmak da bu kolaylıklardan biri.
ali@zion:~$ echo "Bu komut tekrar edilecek"
Bu komut tekrar edilecek
ali@zion:~$ history
1 hostname
2 lscpu
3 dmidecode
4 dmidecode -t 0
.................................
267 history | grep sudo
268 history | grep upgrade
269 echo "Bu komut tekrar edilecek"
270 history
“history” çıktısında ilk sütunda yer alan numaralara dikkat edin. Ekrana “Bu komut tekrar edilecek” yazan “echo” komutu, 269. sırada. 269. sıradaki komutu tekrar çalıştırmak için “!269” yazabiliriz:
268 history | grep upgrade
269 echo "Bu komut tekrar edilecek"
270 history
ali@zion:~$ !269
echo "Bu komut tekrar edilecek"
Bu komut tekrar edilecek
Önce çalıştırılan komut, sonrasında da o komutun çıktısını görüyoruz.
Eğer yazdığınız son komutu tekrar çalıştırmak isterseniz, “!!” ifadesini kullanabilirsiniz:
ali@zion:~$ whoami
ali
ali@zion:~$ !!
whoami
ali
Yine “!” işaretini kullanarak, yazacağınız karakter dizisine uygun en son komutu çalıştırabilirsiniz. Aşağıdaki örnekte, “echo” kullanılarak ekrana 3 farklı mesaj yazdırılmış. Devamında, “!ec” ifadesi kullanılarak, “ec” ile başlayan en son komutun tekrar edilmesi sağlanmış:
ali@zion:~$ echo Khabib Nurmagomedov
Khabib Nurmagomedov
ali@zion:~$ echo Wayne Rooney
Wayne Rooney
ali@zion:~$ echo Michael Jordan
Michael Jordan
ali@zion:~$ !ec
echo Michael Jordan
Michael Jordan
Bir Önceki Komutu root Yetkileriyle Çalıştırma
root yetkileri gerektiren uzunca bir komut yazıp Enter’a bastıktan hemen sonra, başına “sudo” ya da benzeri bir komutu eklemeyi unuttuğunuzu fark ettiğiniz zamanlar olmuştur. Hatırlarsanız, son komutu çalıştırmak için “!!” ifadesini kullanıyorduk. Benzer mantıkla, “sudo !!” ya da “su -c !!” ifadelerini kullanarak, son yazdığınız komutu root yetkileriyle çalıştırabilirsiniz:
ali@zion:~$ id
uid=1000(ali) gid=1000(ali) groups=1000(ali),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),116(lxd)
ali@zion:~$ sudo !!
sudo id
[sudo] password for ali:
uid=0(root) gid=0(root) groups=0(root)
ali@zion:~$ whoami
ali
ali@zion:~$ su -c !!
su -c whoami
Password:
su: Authentication failure
Yukarıdaki örneği inceleyelim. “id” komutu çalıştırılmış ve kullanıcının bilgilerini vermiş. “sudo !!” ifadesi ile, aynı komutun root yetkileriyle çalıştırılması istenmiş ve “ali” kullanıcısına parolası sorulmuş. Devamında ise “id” komutunun çıktılarının değiştiği, root’un bilgilerini verdiği görülüyor. “su -c !!” için ise durum daha farklı. Burada; “sudo”dan farklı olarak, “root” kullanıcısına geçip bu komutu çalıştırmak istiyoruz. Bu nedenle sudo üyesi kullanıcının değil, root kullanıcısının parolasının yazılması gerekiyor.
Önceki Komuttan Argüman Çağırma

Bir önceki komutunuzun argümanlarına ihtiyaç duyduğunuzda, Bash’in bazı özel ifadelerini kullanarak bu argümanları yeni komutunuzda kullanabilirsiniz. Bir önceki komutunuzdaki ilk argümanı çağırmak için “!^”, son argümanı çağırmak için ise “!$” ifadelerini kullanabilirsiniz:
ali@zion:~/test$ ls
cokasiriuzundosyaadi.txt
ali@zion:~/test$ cp cokasiriuzundosyaadi.txt kopya1.txt
ali@zion:~/test$ cp !^ kopya2.txt
cp cokasiriuzundosyaadi.txt kopya2.txt
ali@zion:~/test$ ls
cokasiriuzundosyaadi.txt kopya1.txt kopya2.txt
Yukarıdaki örnekte, “cp” komutu ile dosyanın bir kopyası alınmış. Aynı dosyanın bir kopyası daha alınmak istendiğinden, dosyanın adını tekrar yazmaktansa, “!^” ifadesi kullanılmış.
ali@zion:~/test$ sudo systemctl start sshd.service
ali@zion:~/test$ sudo systemctl status !$
sudo systemctl status sshd.service
● ssh.service - OpenBSD Secure Shell server
Loaded: loaded (/lib/systemd/system/ssh.service; enabled; vendor preset: enabled)
Active: active (running) since Thu 2022-12-08 23:06:32 UTC; 5s ago
Docs: man:sshd(8)
man:sshd_config(5)
Process: 30214 ExecStartPre=/usr/sbin/sshd -t (code=exited, status=0/SUCCESS)
Main PID: 30224 (sshd)
Tasks: 1 (limit: 4611)
Memory: 1.2M
CGroup: /system.slice/ssh.service
└─30224 sshd: /usr/sbin/sshd -D [listener] 0 of 10-100 startups
Dec 08 23:06:32 zion systemd[1]: Starting OpenBSD Secure Shell server...
Dec 08 23:06:32 zion sshd[30224]: Server listening on 0.0.0.0 port 22.
Dec 08 23:06:32 zion sshd[30224]: Server listening on :: port 22.
Dec 08 23:06:32 zion systemd[1]: Started OpenBSD Secure Shell server.
Bu örnekte ise, “sshd” servisi başlatılmış ve devamında durum kontrolü için servisin adını tekrar yazmaktansa, “!$” ifadesi kullanılarak bir önceki komutun son argümanı, yani “sshd.service” ifadesi çağrılmış.
Peki argümanlar için geçerli olan Bash ipuçları bunlardan mı ibaret? Tabii ki hayır. Baştaki ve sondaki argümanlar için özel ifadeler olduğu gibi, sıra numarası belirterek dilediğiniz argümanı da çağırabilirsiniz. Bunun için “!!:N” benzeri bir ifade kullanılır. Örneğin, bir önceki komuttaki üçüncü kelimeyi çağırmak için “!!:2” ifadesini kullanmanız gerekiyor (evet, 2).
Bu sayılarda 0 (sıfır), komutun ilk kelimesini gösteriyor. Yani kelimeleri saymaya sıfırdan başlamamız gerekiyor.
Aşağıdaki örnekte; birden fazla dosya oluşturuyoruz. Sonrasında da bu dosyalardan bir tanesinin ismini değiştiriyoruz. Başka bir tanesini ise “/tmp” dizinine taşıyoruz:
ali@zion:~/test$ touch buradaki_dosya tmpye_gidecek_dosya yalnis_yazilmis_dosya bambaska_bir_dosya
ali@zion:~/test$ mv !!:2 /tmp && mv !!:3 dogru_yazilmis_dosya
mv tmpye_gidecek_dosya /tmp && mv yalnis_yazilmis_dosya dogru_yazilmis_dosya
ali@zion:~/test$ ls
bambaska_bir_dosya buradaki_dosya dogru_yazilmis_dosya
“mv” komutlarını “&&” ile bağlamamızın amacı ise, tek tek çalıştırsaydık bir önceki komutun değişmiş olacağıydı. Biz, “touch” ile başlayan komutun argümanlarını çağırmak istedik. Bunu tek tek yapsaydık, en son çalışan komut “mv” olurdu ve touch’tan argüman çağıramazdık.
En Sık Kullandığınız Komutları Listeleme
Linux sisteminizi yönetirken shell’inizde en sık kullandığınız komutları listemek için farklı yollar bulabilirsiniz. Burada, “history” komutunun çıktısı üzerinde bazı string işleme komutlarını çalıştırarak bir liste edineceğiz:
ali@zion:~$ history | awk '{print $2}' | sort | uniq -c | sort -rn | head
43 sudo
41 nano
28 ls
18 uptime
18 cd
16 history
8 rm
7 man
7 ll
7 echo
history | awk ‘{print $2}’ | sort | uniq -c | sort -rn | head
Hmm…
“history” komutu ile komut geçmişini listeledik. Bu çıktıyı “awk” komutuna gönderdik ve ikinci sütunu aldık. Yani history çıktısının ilk sütunundaki sayılardan kurtulduk. Devamında, “sort” komutunu kullanarak çıktımızı alfabetik olarak sıraladık. Sıralı listeyi, “uniq” komutuna göndererek tekrar eden satırlardan kurtulduk. Fakat bunu yaparken “-c” parametresi sayesinde, her ifadenin kaç kez tekrar ettiği bilgisini de edinmiş olduk. Sonrasında; yine “sort” komutunu kullanarak, bu sefer alfabetik yerine nümerik (“-n”) bir sıralama yaptık ve bu sıralamayı ters çevirdik (“-r”). Son olarak “head” komutunu kullanarak bu listedeki ilk 10 satırı getirdik.
Bu sayede Linux sistemimizde en sık çalıştırdığımız 10 komutu ve bu komutları kaçar kez çalıştırdığımızı görmüş olduk.
Bash Komut Geçmişini Temizleme
Shell geçmişinizi temizlemek için “history -c” komutunu kullanabilirsiniz. Bu oturumda yazmış olduğunuz tüm komutları bu sayede temizleyebilirsiniz.
Temizliği yaptıktan sonra tekrar “history” komutunu çalıştırdığınızda, sadece az önce yazdığınız “history” komutunu göreceksiniz.
ali@zion:~$ history -c
ali@zion:~$ history
1 history
Peki yeterli mi? Hayır. Şu anki oturumunuzda yazdığınız komutları geçmişten sildiniz. Burası tamam. Ancak sisteme yeniden giriş yaptığınızda, önceki oturumlardan kalan geçmiş komutları yine görebileceksiniz.
Bu da bizi, kullanıcının ev dizininde yer alan “.bash_history” dosyasına getiriyor. Siz oturumunuzu sonlandırırken, komut geçmişiniz bu dosyaya yazılır. Eğer tüm geçmişi temizlemek gibi bir niyetiniz varsa, varsayılan olarka kullanıcınızın ev dizininde yer alan bu dosyayı da silmeniz gerekmektedir.
İlerleyen yazılarda farklı konularda Bash ipuçları paylaşmaya çalışacağım.