Sık kullandığım kendi yazdığım betikler
(evanhahn.com)- 10 yıldan uzun süredir dotfiles bakımını yaparken yazılan çeşitli shell betikleri arasından en sık kullanılanlar tanıtılıyor
- Pano, dosya yönetimi, internet, metin işleme, REPL başlatıcıları, tarih/saat, AV, süreçler, hızlı başvuru, sistem, çeşitli başlıklarına ayrılıyor; her betik kısa bir sarmalayıcı biçiminde ve gerçek kullanım örnekleri odaklı sunuluyor
- Betiklerin çoğu macOS ve Linux üzerinde çalışıyor; temel felsefe ise “halihazırda var olan araçların uğraştırıcı küçük pürüzlerini düzleştirmek”
pbcopy/xclip,python3 -m http.server,yt-dlp,ffmpeg,mpvgibi standart yardımcı araçların entegrasyonu
- En sık kullanılanlar arasında
copy/pasta/pastas/cpwd,mkcd/tempe/trash/mksh,serveit/getsong/getpod/getsubs,scratch/straightquote/markdownquote,timer/boop/tunesyer alıyor
Dotfiles’ımı sürdürürken yazdığım en sık kullandığım betikler
- 10 yılı aşkın süredir kişisel dotfiles’larımı yönetirken oluşturduğum çeşitli shell betikleri arasından, sık kullandıklarımı alanlara göre derledim
- Her betik; amacı, kullanım sıklığı ve temsilî örnekleriyle birlikte verilerek hemen uygulanabilirlik artırılıyor
- Ortak hedefler tekrarlayan işleri kısaltmak, platformlar arası soyutlama sağlamak ve güvenlik ile okunabilirliği artırmak
Pano ile ilgili betikler
copyvepasta: sistem pano yöneticisini saran sarmalayıcılar; macOS’tepbcopy, Linux’taxcliptabanlıcopy: çıktıyı panoya kopyalarpasta: panodaki metni alıp çıktılar- Örnek:
run_some_command | copy,pasta > file.txt,vim "$(pasta)",pasta | base64 --decode
pastas: pano durumu her değiştiğinde yeni içeriği gerçek zamanlı yazdıran bir araç- Kopyaladığınız tüm bağlantıları dosyaya kaydetmekte veya birden fazla bağlantıyı topluca indirmekte kullanışlı
- Örnek:
pastas > everything_i_copied.txt,pastas | wget -i -
cpwd: geçerli dizin yolunu panoya kopyalar- Birden fazla terminal sekmesi arasında dizin taşırken pratiktir
Dosya yönetimi betikleri
mkcd foo: dizin oluşturur ve hemen içine geçer (mkdir foo && cd fookısayolu)tempe: geçici bir dizine geçer (cd "$(mktemp -d)"); sandbox ortamında geçici iş yaparken ayrıca temizlik gerektirmez- Örnek:
# Download a file and extract it tempe wget 'https://example.com/big_file.tar.xz' tar -xf big_file.tar.xz # ...do something with the file... # Write a quick throwaway script to try something out tempe vim foo.py python3 foo.py
- Örnek:
trash: dosyaları çöp kutusuna taşır (macOS/Linux desteği), basitrmkullanımına kıyasla hataları önlemeye yardımcı olurmksh: yeni bir shell script dosyası oluşturur, çalıştırılabilir yapar ve düzenleyicide hemen açar
İnternet ile ilgili betikler
serveit: yerel dizinde statik dosya sunucusu başlatır (varsayılan port 8000, Python yoksa alternatif kullanır)getsong,yt-dlpile en yüksek ses kalitesinde ses indirme işini yapargetpod: videoyu podcast için uygun ses olarak alan bir sarmalayıcıdırgetsubs: önce resmî altyazıları, yoksa otomatik altyazıları kullanan mantıkla İngilizce altyazı çıkarır. Özetleme hattı ve yedekleme için uygundur- Örnek :
getsubs https://video.example/foo | ollama run llama3.2 "Summarize this"
- Örnek :
wifi off/on/toggle: sistem WiFi kontrolü; ağ sorunlarını giderirken kullanılırurl: URL dizgesini ayrıştırıp protokol, ana makine adı, yol, sorgu, hash gibi parçaları böler ve çıkarır
Metin işleme betikleri
line 10: standart girdiden belirli bir satırı yazdırır (head,tailbenzeri)scratch:$EDITOR $(mktemp)gibi geçici bir metin tamponunu Vim’de hızlıca açmak için; tek seferlik notlar veya küçük dönüşümler için uygunstraightquote: akıllı tırnakları normal (düz) tırnaklara dönüştürür; kod içindeki tırnak sorunlarını önler ve dosya boyutunu küçültürmarkdownquote: her satırın başına>ekleyerek Markdown alıntısı oluştururlength: giriş dizgesinin uzunluğunu döndürür (wc -cyerine kullanılabilir)jsonformat: JSON verisini okunaklı biçimde yazdırıruppered/lowered: dizgeyi büyük/küçük harfe dönüştürürnato bar: giriş dizgesini NATO alfabe koduna çevirir (Bravo Alfa Romeogibi)u+ 2025: Unicode karakterinin adını ve simgesini gösterirsnippets foo: belirli bir kısa ifadeyi kişisel snippet sözlüğünden çağırırsnippet arrowbir ok → döndürür,snippet recruiterise “not interested” gibi şablon bir mesaj verir
REPL başlatıcıları
- Ruby’nin
irbaracından ilhamla, çeşitli dillerin REPL’lerini hızlıca çalıştırır:iclj: Clojureijs: Deno (yoksa Node)iphp: PHPipy: Pythonisql: SQLite (Bash içinde bellek modu)
Tarih ve saat betikleri
hoy: geçerli tarihi ISO biçiminde yazdırır (örnek: 2020-04-20); dosya adı öneki olarak kullanılabilirtimer 10m: süre sayacı (ör. 10 dakika); bitince ses ve işletim sistemi bildirimi gönderirrn:datevecalkullanarak mevcut saati ve aylık takvimi okunaklı biçimde gösterir
Ses, video ve görsel işleme
ocr: macOS’te görsel dosyalarından metin çıkarır (ileride genişletilmesi planlanıyor)boop: son komutun başarı/başarısızlık durumuna göre sesli bildirim verir (test çalıştırmaları sonrası gibi durumlarda sezgisel)sfx: belirli efekt ses dosyalarını (.ogg) çalar;boop,timerile birlikte kullanılabilirtunes: ses dosyalarınımpvile çalar (shuffle destekli)pix: fotoğraflarımpvile görüntülerradio: sevilen internet radyo istasyonları için hızlı başlatıcıspeak: stdin’den okunan metinden Markdown’ı kaldırıp metin-konuşma (TTS) üretirshrinkvid: video dosyalarınıffmpegile sıkıştırırremoveexif: JPEG’lerden EXIF verisini siler; ileride farklı format desteği planlanıyortuivid: terminal içinde video izletir; pratik kullanımı az olsa da ilginç bir özellik
Süreç yönetimi
each:xargs,find ... -execiçin bir alternatif; karmaşık komutları çalıştırmayı kolaylaştırırrunning foo: belirtilen anahtar sözcüğe göre çalışan süreçleri (PID, komut vb.) bulur ve okunması kolay biçimde gösterirmurder:killiçin bir sarmalayıcı; yumuşak sinyallerden başlayıp gerekirse zorla sonlandırmaya kadar aşamalı kapatma uygular. Program kapatırken hataları önlemeye yardımcı olurwaitfor $PID: belirtilen PID sonlanana kadar bekler; bu sırada uyanık kalırbb my_command: komutu gerçek arka plan modunda çalıştırır; daemon gibi işler için uygundurprettypath:$PATHdeğişkenini satır satır, kolay okunur biçimde yazdırır (debugging için yararlı)tryna my_command/trynafail my_command: komut başarılı olana kadar yinele, ya da başarısız olana kadar yinele; ağ işleri dahil çeşitli otomasyonlarda kullanılabilir
Hızlı başvuru araçları
emoji: anahtar sözcüğe göre emoji arar ve yazdırırhttpstatus: tüm HTTP durum kodlarını listeler, belirli bir kodun açıklamasını gösteriralphabet: İngilizce alfabenin tüm küçük ve büyük harflerini yazdırır (şaşırtıcı derecede sık kullanılıyor)
Sistem yönetimi
theme 0/theme 1: sistem genel temasını (koyu/açık) değiştirir; Vim, Tmux vb. ile bağlantılı çalışırsleepybear: sistemi uyku moduna alır (macOS, Linux)ds-destroy:.DS_Storedosyalarını özyineli olarak siler; macOS kullanıcı klasörlerini düzenlerken faydalıdır
Diğer
catbin foo: PATH içindeki bir dosyanın kaynak kodunu doğrudan gösterirnotify: işletim sistemi düzeyinde bildirim gönderir; uzun süren işler bittiğinde anında haber veriruuid: sürüm 4 UUID üretir
Sonuç
- Bu yazıda tanıtılan betikler, yazarın gerçekten sık kullandığı araçlardır
- Kendi yazdığınız kısayol betikleri iş akışını hızlandırma, hata önleme ve üretkenliği artırma açısından çok etkilidir
- Sizin de kendi otomasyon betiklerinizi üretip kullanmanız önerilir
2 yorum
GeekNews'te yayımlanan Ask GN: Sık kullandığınız shell snippet'ları var mı? başlıklı yazı da aklıma geliyor
Hacker News görüşü
trash a.txt b.pngkomutu,a.txtveb.pngdosyalarını Çöp Kutusu'na taşır; Mac ve Linux'ta desteklenir. Benim eskiden kullandığım yöntem dosyaları tek tek sırayla işliyordu; bu yüzden silme sesi her dosya için duyuluyordu ve Finder'da ⌘Z ile yalnızca son dosya geri alınabiliyordu. İyileştirilebilir ama aslında macOS'e yerleşik gelen resmitrashkomutunu kullanmak daha pratik. Finder kullanılmadığı için ses ya da ⌘Z ile geri alma yok, ama daha hızlı ve “Put Back” özelliği de çalışıyor. Ayrıca JSON pretty-print için node yerine jq kullanılırsa çok daha kısa kodla çözülüyor ve güncel macOS sürümlerinde jq önceden kurulu geliyor. UUID yazdırma da benzer; v4 UUID gerektiğindeuuidgenkullanmak en güvenlisi (man sayfasına bakın)Kendi yazdığınız script'ler yerine yerleşik özellikleri kullanmak çoğu zaman daha iyi. Mesela vim'de markdownquote kullanmak yerine ilk sütunu ctrl-v ile seçip
i>yazıp escape'e basmak yeterli. Daha kısa ve verimli.u+ 2025neden ñ döndürüyor merak ediyorum; çünkü gerçek Unicode değeri U+00F1. Ayrıcacatbin foo,cat "$(which foo)"ile aynı şey. zsh kullanıyorsanızcat =foodaha kısa ve daha güçlü. zsh'de=sonrasında otomatik tamamlama çalıştığı için uzun komutlarda da güvenli. Ben bunufile =firefox,vim =myscript.shgibi sık kullanıyorumYazarın
uuidgen'i bilmiyor olduğunu tahmin ediyorum. Böyle bilgi ya da ayarları paylaşmanın güzel yanı, hep kör noktalarımı ortaya çıkarması; bu yüzden paylaşmak önemliPython da varsayılan olarak JSON pretty-print yapabiliyor
trashbilgisi için teşekkürler. Ben şimdiye kadar birden fazla dosyayı Çöp Kutusu'na göndermek içintell app \"Finder\" to move {%s} to trashbiçiminde AppleScript kullanıyordumrmvetrashalternatifi olarakripde öneririm rip proje bağlantısıGeliştirici hayat döngüsü gerçekten ilginç. Başta tamamen vanilla shell ortamı kullanıyorsunuz; 1-2 yıl sonra yüzlerce satırlık script ve bash alias'ı yazıyorsunuz. Şimdi 15. yılımdayım ve tam tersine mümkün olduğunca varsayılan shell'i kullanıyor, alias bile tanımlamıyor, karmaşık şeyleri Python ya da Go ile çözüyorum
Bu eğilim bana bir aydınlanmadan çok düpedüz tembellik gibi geliyor (aynısını yaptığım için söylüyorum). Ortamını derinlemesine özelleştiren iş arkadaşlarım sayesinde sık sık yeni araçlar öğreniyorum; yakın zamanda Linux sistemime atuin ve fzf gibi araçlar da ekledim
alias ve function'ları dotfile'lara yazıp sık kullanılan komutları kaydetmek/hatırlamak için kullanıyorum. Sık kullanılan araç setimi sürekli güncelliyorum ve yeni workstation'a taşımak da kolay oluyor
Eskiden yalnızca bir tane nix bilgisayarım varken çok özelleştirme yapmak istiyordum. Şimdi aynı anda birden fazla makine kullandığım için sadece gerekli paketleri kurup ortamı standartlaştırıyorum
Python ile yazılmış olanlara da hâlâ script diyorum. Bence script terimi sadece shell script ile sınırlı değil
Bugünlerde genç mühendislerle çalışırken onların bir sürü dotfile kullandığını görünce “ben de eskiden böyleydim, ne uğraştırıyordu” diye düşünüyorum. Artık araçları seçici kullanıyor, gereken şeye esnek biçimde uyarlıyorum. Başkalarının tarzına da saygı duyuyorum
HN'de böyle pratik ipuçları içeren gönderiler bulmayı gerçekten seviyorum. Diğer geliştiricilerin gerçekte nasıl çalıştığını ve benim neleri öğrenip uygulayabileceğimi merak ediyorum. İlk başta “bana lazım olmaz” diye düşünseniz bile, bir iş kolaylaştığında o işin kendisi yeni bir workflow yaratıyor. O yüzden önce deneyip uyan şeyleri bırakıyorum. Orijinal yazının tarzı da hoşuma gidiyor — gerçek kullanım sıklığını da yazmış olması gerçekten pratik. Ben basit işler için çoğu zaman tarayıcı devtools'u açıp JavaScript ile işi bitiriyorum. (Örneğin bir string'i küçük harfe çevirmek gibi)
Yazarın yöntemiyle benim yöntemimin harcadığı süreyi, script'i yazma/hatırlama/başvurma/taşıma maliyetini de hesaba katıp gerçek bir cost-benefit analysis yapmak ilginç olurdu
Bu Bash kısayol cheat sheet görseli çok yardımcı oluyor
linescript'i yerine belirli satırları yazdırmak içinsedile daha basit yapılabilirbununla ikinci satır yazdırılabilir. Birden fazla satır için de
kullanılabilir; bu yüzden
linescript'inden daha avantajlısedkomutunu bir arada kullanmam gereken durumlar çok oluyor. O zaman ilksedkomutunu sürekli değiştirmek gerekiyor. Bazensedöncesindegrepde gerekebiliyor; amacat,tail,headile parçalarsanız her işlevi modül gibi kullanmak daha esnek oluyor. Bu, her aracın tek bir iş yapmasını savunan Unix felsefesine de uyuyorSık kullandığım bazı basit script'ler var. Mesela:
Kişisel script'lerin başına
,(virgül) koyuyorum; böylece hızlı geçiş yapabiliyorum. Kendi script'lerimi zaman zaman geçmiş üzerinden istatistikleyip artık kullanmadıklarımı temizlemenin değerli olduğunu düşünüyorumHenüz genelleştiremedim ama
unmvscript'i ile epey rahat çalışıyorumÇok iyi ipuçları var ama ben genelde standart yardımcı araçları (
sed,awk,grep,xargsvb.) öğrenip kullanıyorum. Çünkü farklı sistemler arasında çalışırken kişisel script ve alias'larımın çoğu kurulu olmuyor. Standart araçlarla neredeyse her şey yapılabiliyorapt-getile kolay kurulur hale geliyor. Kişisel script yığını yerine iyi bakılan paketler şeklinde olmaları daha tercih edilir benceEn sevdiğim arşiv açma script'imi paylaşayım
Bunun sıkıştırma yapan ters counterpart'unu da yazmak istiyorum
Ben
dtrxkullanıyorum; arşivi otomatik olarak bir klasörün içine açması çok iyi oluyorBana
aunpackdaha rahat geliyorGerçekten temiz bir çözüm
inotifyvesystemduser service da eklerseniz bir seviye daha ileri gider. Bunun paket olarak sunulan sürümleri de zaten var. Kendi yaptığınız çözüm biraz kare tekerleği yeniden icat etmek gibi duruyormp4 encode etmek veya kesmek için hep kullandığım iki function var. Flag'ler sayesinde WhatsApp, mobil Discord gibi ortamlarda uyumluluk maksimum oluyor
fftime, orijinali yeniden encode etmeden hızlı kesim yapar ama videoya göre küçük sorunlar çıkarabilir (örneğin oynatılamama gibi). Yeniden encode etmek isterseniz-c copyseçeneğini kaldırmanız yeterlialias veya function oluşturup test ederken
~/.zshrcdosyasını anında yeniden yüklemek için aşağıdaki alias'ı kullanıyorumAyrıca Mac'te docx dosyalarında grep benzeri arama için şu function'ı kullanıyorum
Bir de Mac'imdeki panoyu anonimleştirip ChatGPT ya da şirket içi Slack gibi herkese açık kanallara yapıştırmadan önce debug amaçlı şu function'ı çalıştırıyorum. Function çalışınca yeni dönüştürülmüş pano içeriğini stdout'a da yazdırdığı için gözden kaçan bir şey olup olmadığını kontrol edebiliyorum