TLDR;1
Linux’te shell ile çalışırken bir çok komut yazmak gerekiyor. İnsan her ne kadar günün büyük kısmını genelde bildiği komutlar ile geçirse de eskiden kullandığı bir komutu hatırlayamadığında durumlar olabiliyor. Bir de bu işin içine pipe mekanizması girecek ise, durum bir hayli can sıkıcı hale dönüşüyor. Böyle durumlarda uzun komutları hatırlayan kişileri tebrik ediyorum. 3 Ne yazık ki benim hafızam o kadar kuvvetli değil.
Bu yazıda, Linux komut satırında yapılan işlerin tekrarlanabilir olması açısından kullandığım araçlardan bahsettim.
Alias
Eminim ki herkes alias komutundan haberdardır ve en basitinden ll='ls -l' gc='git clone' gibi komutları kullanıyordur. Aliasların tanımları genelde statik olduğundan ve herkes kendine göre kısayol tanımladığından dolayı, pek geliştirmeye ve sürdürülebilirliğe sahip değiller.4
komutlar.txt
Her erkeğin ömür boyu sakladığı kablo dolu kutusu olduğu gibi, her Linux kullanıncısının mutlaka ben bunu ilerde kullanırım diye not aldığı komutlar bulunmaktadır. Bu çözüm de dosya kayboluncaya5 kadar iş görmektedir. 🙂
CheatSheet
Bir çoğunuz İngilizcede CheatSheet diye geçen kavramı duymuşsunuzdur. Hatta eminim bir çoğu tarayıcı bookmarklar’ınızda öylece okunmayı bekliyordur. Bilmeyenler için bu CheatSheet’in esas amacı herhangi bir yapının en çok kullanılan özelliklerini listeleyip insan beyni için kategorilendirilmiş bir isveç çakısı oluşturmak diyebiliriz.6
Navi
Goygoy kısmı bitirdiğimize göre, yazının esas amacı olan ve uzun süredir kullandığım ve performansımı önemli ölçüde arttırdığını düşündüğüm navi aracından bahsedeceğim.
Araç en basit tabir ile kendini interaktif CheatSheet olarak tanımlıyor. Yani biraz daha somutlaştırırsak, yazdığınız komutlara bir başlık vererek o komutu interaktif7 bir şekilde çağırmanıza/kullanmanıza yarıyor.
Aracı bir problem üzerinden anlatırsak:
Problem: Farz edelim ki projenizde bir sorun var ve main.c adlı dosyanın kimler tarafından değiştirildiğini, hangi tarihlerde kimlerin, hangi satırları eklediğini git komutunu kullanarak görmek istiyorsunuz.
Çözüm 1(Man pages)
Problemi man komutunu kullanarak çözmek istiyorsanız man git-log
yazıp –follow parametresini görmeniz pek uzun sürmez. Ancak git’in alması gereken -p parametresini görmeniz için yaklaşık olarak 1100 satır okumanız veya aramaya inanmanız gerekiyor.
Çözüm 2(Google + stackoverflow)
- Until Success
- Copy
- Paste
Problemin devamı
Sıkıntı bunu ikinci kez yapmak istediğinizde, yukarıda kopyala yapıştır yaptığımız komutu ne kadar hatırlıyorsunuz.
Çözüm 3(navi)
Navi burada kullandığınız komutları daha hızlı hatırlamanızı sağlıyor. Ctrl + g yaptıktan sonra komut veya ona verdiğiniz başlık ile alakalı yazdığınız kelimeler içinde arayarak, size uygun olan komutu kullanmanızı sağlıyor.8
Nasıl çalışıyor
Ben nasıl kullanıyorum.
Açıkçası yukarıda gördüğünüz üzere, navi varsayılan olarak seçilen komutu hemen çalıştırıyor. Yanlışlık ile bastığınız enter tuşu, büyük bir sıkıntı yaratabilir. Bu yüzden ben bu varsayılan olarak gelen hemen çalıştırma özelliği yerine --print ile ekrana bastırıp kontrol ettikten sonra çalıştırmayı tercih ediyorum.
Eğer kendiniz tanımlamak isterseniz, aşağıdaki gibi tanımlanması gereken bir syntax’ı var.
1 2 3 4 5 |
# Show history of single file # Açıklama git log --follow -p -- <working_tree> # Komutun Statik kismi <Dinamik Kısım> $ working_tree: git ls-files # Dinamik olan kısmın tanımlanması # Bu kısmı farklı satırlarda kullanılabiliyor. |
Aşağıda kendimin tanımladığım bloklardan örnek verdim.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# Hali hazirda localde olan değişiklikler ile yeni branch oluşturur # Create safe branch and pull git checkout master; \ git add . ; \ git stash ; \ git pull; \ git stash pop;\ git checkout -b <new_branch_name> ; # O anki branch ismi ile otomatik commit yaptıktan sonra yeni upstream olusturup oraya push yapar # Easy first push for new branch git commit -m "<branch_name>"; \ git push --set-upstream origin <branch_name>; $ branch_name: git branch | grep \* | cut -d ' ' -f2 # Test UDP connection nc -z -v -u localhost <port> # sync forked repository with local git remote rm upstream ;\ git remote add upstream <upstream_link> ;\ git checkout master ;\ git pull --rebase upstream master; # docker imajlarını belittiğim filtreye göre siler # docker delete images with filter docker images | grep <filter> | col3 | xargs docker rmi # Delete all iptables changes iptables -F ;\ iptables -t nat -F ;\ iptables -t mangle -F ;\ iptables -X ; # Show logs of selected container docker logs --tail 100 <container_id> | less |
Daha fazlası için:
- Github Repository: https://github.com/denisidoro/navi
- Online olarak denemek istiyorsanız: https://www.katacoda.com/denisidoro/scenarios/navi
- Yine komut satırında verimlilik ile alakalı yazdığım bir yazı