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

Bash ipuçları
Bash İpuçları

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.