Seri: oh-my-zsh
Part 3/4Selamlar yoldaşlar! 🚀
Serinin ikinci bölümünde, Bash'ten Zsh'e göç ettikten sonra karşımıza çıkan o meşhur, can sıkıcı uyumluluk problemlerinden birini bizzat kendi sistemimde çözdüğüm yöntemle ele alıyoruz: shopt komutu ve Bash uyumsuzluğu!
Eğer daha önce Bash kullanırken shopt nimetlerinden faydalandıysanız, ne kadar pratik bir araç olduğunu çok iyi bilirsiniz. Kısaca bahsetmek gerekirse shopt (shell options), kabuk içerisindeki bazı temel davranışları değiştirip özelleştirmenizi sağlar. En basitinden, bir dizine girmek için cd klasor-adi yazmak yerine sadece klasor-adi yazıp Enter'a basarak dizinin içine uçmanızı sağlayan autocd özelliği buna harika bir örnektir! Sanki her gün gittiğin mahalle kahvesine girdiğinde "Usta her zamankinden" deyip masana kurulmak gibi bir samimiyettir bu.
Ancak Zsh'e göç ettiğimizde, o acı gerçekle yüzleşiriz. Zsh kendi içinde farklı bir mimari olduğu için, Bash uyumlu bu komutu koşturmaya çalıştığınızda terminal suratınıza o soğuk hatayı fırlatır: "shopt: command not found".
Peki benim gibi Arch Linux kullanan ve sisteminde hata toleransı sıfır olan titiz bir geek bu sorunu nasıl çözer? Gelin bu uyumsuzluğu kökünden halledelim! 🛠️
🛠️ Zsh İçerisinde shopt Çözümü#
Bash temelli shopt komutunun eksikliğini Zsh altında gidermek aslında sandığınızdan çok daha basit. Yazacağımız ufak bir wrapper script sayesinde Zsh'i kandıracağız ve arka planda Bash'e işi yaptıracağız.
Adım 1: Wrapper Script Oluşturma#
Öncelikle terminalimizi açıp ev dizinimizde veya herhangi bir yerde geçici olarak shopt adında boş bir dosya oluşturuyoruz:
touch shopt
Oluşturduğumuz bu dosyayı favori editörümüzle açıp içine Zsh'ten gelen argümanları Bash'e paslayacak şu kod bloğunu yapıştırıyoruz:
#!/bin/bash
args='';
for item in $@
do
args="$args $item";
done
shopt $args;
Adım 2: Script'i Sistem Yoluna Taşıma#
Bu script'in sistemin her yerinden çalışabilmesi için dosyayı /usr/bin altına taşımamız gerekiyor. İşleri şansa bırakmamak için root yetkileriyle bu işi hallediyoruz:
sudo mv shopt /usr/bin/
İpucu ⚡ /usr/bin altına taşıdığımız bu script'in çalıştırılabilir olması gerekiyor. Terminalden sudo chmod +x /usr/bin/shopt komutunu vermeyi unutmayın, yoksa 'Permission Denied' hatasıyla karşılaşırsınız!
Adım 3: .zshrc Dosyasına Alias Tanımlama#
Şimdi tek yapmamız gereken Zsh'e shopt yazıldığında bizim yazdığımız wrapper script'i çalıştırmasını söylemek. Kutsal dosyamız .zshrc'yi açıp şu satırı en alta ekliyoruz:
alias shopt='/usr/bin/shopt'
Artık Zsh içerisinde shopt komutunu sorunsuz şekilde koşturabilirsiniz. Sisteminizde Bash uyumluluğu geri geldi, afiyet olsun! 😄
💾 Yedekleme ve Otofobi (Scriptleri Unutma Korkusu)#
Hacı bura çok kritik. Temiz bir Arch Linux kurulumu yaparken ya da sistemi başka bir bilgisayara taşırken, /usr/bin altına kendi ellerimizle yazdığımız bu özel script'leri yedeklemeyi unutmak tam bir klasik! Ben de zamanında bu hataya çok düştüm, sistemi kurduktan sonra "Ulan benim shopt neden çalışmıyor?" diyerek paronoyakça hata aradım. 🤣
Eğer sistem taşıma sırasında bu tarz özel script'leri unutmaktan korkuyorsanız, bizzat yazdığım Oto Script Oluşturucuyu (otoscript) kullanabilirsiniz. Bu araç sayesinde script'lerinizi tek bir dizinde tutup .zshrc içinde şu şekilde çağırabilirsiniz:
alias shopt='ScriptDizinim/shopt'
- Wrapper Script için yararlandığım kaynak: larz258
🧪 Test Edebileceğiniz shopt Ayarları#
Wrapper kurulumunu tamamladıktan sonra, yeni shopt gücümüzü test etmek için .zshrc dosyanızın en altına şu popüler Bash seçeneklerini ekleyip deneyebilirsiniz:
# Bash opts Zsh wrapper test
shopt -s autocd
shopt -s cdspell
shopt -s cmdhist
shopt -s histappend
shopt -s expand_aliases
shopt -s checkwinsize
shopt -s globstar 2> /dev/null
shopt -s nocaseglob
shopt -s autocd 2> /dev/null
shopt -s dirspell 2> /dev/null
shopt -s cdspell 2> /dev/null
Not: Bu ayarlar sayesinde yazım hataları otomatik düzeltilecek (cdspell), sadece dizin ismi yazarak o dizine geçilebilecek (autocd) ve terminaliniz çok daha akıllı davranacaktır.
Eğer benim tam olarak nasıl bir terminal konfigürasyonu kullandığımı merak ediyorsanız Windows Terminal / WSL Ayarlarım deposuna ve bu script'leri yönettiğim Script Oluşturucu aracına göz atabilirsiniz.

Yorumlar