Bash'dan zsh'ye geçmek istiyorum ancak bash komut dosyalarının uyumluluğu konusunda endişeliyim.
Tüm bash scriptleri / işlevleri zsh ile uyumlu mu? Bu nedenle, eğer bu doğruysa, zsh bash için sadece bir donanım mı?
Bash'dan zsh'ye geçmek istiyorum ancak bash komut dosyalarının uyumluluğu konusunda endişeliyim.
Tüm bash scriptleri / işlevleri zsh ile uyumlu mu? Bu nedenle, eğer bu doğruysa, zsh bash için sadece bir donanım mı?
Yanıtlar:
Komut dosyalarınız çizgi ile başlıyorsa #!/bin/bash, varsayılan kabuğunuz zsh olsa bile bash kullanılarak çalıştırılır.
Zsh'ın sözdizimini bash kelimesine çok yakın buldum ve gerçekten bazı uyumsuzluklar olup olmadığına dikkat etmedim. 6 yıl önce bash'tan zsh'ye sorunsuz bir şekilde geçtim.
.zshrc:)
#!/bin/bashkomut dosyası gibi çalıştırıyorsanız satır göz ardı edilirse source ./script.sh?
#!/usr/bin/env bashyerine, özellikle varsayılan bash'nin oldukça eski olduğu ve yeni sürümlerin hemen hemen her zaman farklı bir yola yüklendiği macOS'ta kullanmalısınız.
Zsh, doğru emülasyon moduna ( emulate shveya emulate ksh) yerleştirirseniz, çoğu Bourne, POSIX veya ksh88 komut dosyasını çalıştırabilir . Bash veya ksh93'ün tüm özelliklerini desteklemez. Zsh, bash'ın çoğu özelliğine sahiptir, ancak birçok durumda farklı bir sözdizimi vardır.
Etkileşimli olarak kullandığınız kabuk, sahip olduğunuz her komut dosyası için anlamsızdır. Senaryoyu çalıştıran kabuk, ilk satırda, shebang satırında belirtilen kabuktur . Örneğin, komut dosyası ile başlarsa #!/bin/bash, bash tarafından yürütülür.
Bash'ı özelleştirdiyseniz, adınızı yalnızca adınızı .bashrcdeğiştiremezsiniz .zshrc. Bazı şeyler sürece iki kabuk arasında kesişme sopa olarak (kesişim ksh88 ve yakın, örneğin takma adları ve işlevleri için, paylaşılabilir pdksh ). Bilgi istemi ayarları, tamamlama işlevleri ve çoğu seçenek gibi başka şeyler de tamamen yeniden yazılmalıdır.
Eğer bir pasajı yazıyorsanız insanlar dan kaynak için .bashrcOr .zshrcve sen iki sürümleri korumak bash programlama özelliklerin çoğunu içerir partisiydi ve zsh özellikleri bir ortak alt, sopa istemiyoruz. Kodunuzun tamamını işlevlere yerleştirin ve aşağıdaki satırı her bir işlevin en üstüne yerleştirin:
if [ -n "$ZSH_VERSION" ]; then emulate -L ksh; fi
Sen kullanabilirsiniz emulate shyerine emulate kshsizin için gerekenler düz sh sözdizimi, daha yakın olmak .profile.
Bir işlev başka bir işlevi çağırırsa, diğer işlev öykünme ayarını devralır; bu nedenle, bu satırı yalnızca son kullanıcı tarafından çağrılan işlevlerde dahili işlevlere koymanız gerekmez.
./my_script.sh. source my_script.shve . my_script.shonu çalıştıracak herhangi bir Shebang'ı görmezden, mevcut kabuk olarak.
Eğer shebang ise #!/bin/bashve senaryonun baslatilmasi gibi ./scriptsenaryonun bash tarafından çalıştırılacağı gibi. Kesinlikle burada sorun yok.
Ancak, zsh ./scriptonu . ./scriptçalışan zsh örneğine uygularsanız veya kaynak olarak kullanırsanız, bash ve zsh sözdiziminin eşleşmemesi oldukça yaygındır.
Örneğin, zsh parametre genişlemelerini varsayılan olarak bölmez, bash bir yardım yerleşikine sahiptir, read -p promptzsh'de yok (sözdizimi çok farklıdır. Cmd \? Prompt , arrays start on 1 (not 0) in zsh,command only search for external commands in zsh, or there is no (simple) equivalent to$ {foo ^} `(zsh içinde sadece büyük harf) , diğerleri arasında, bu (çoğunlukla) benzerliklerin ve bazı farklılıkların uzun bir listesidir .
Bazı durumlarda, zsh'a diğer kabukları taklit etmesi söylenebilir. Bazı durumlarda, olası her iki mermiye taşınabilir ortak bir sözdizimi yoktur (taşınabilir çözümler taklit etmek için diğer adlar veya işlevler kullanmadan).
Bununla birlikte, zsh etkileşimli çalışmayı kolaylaştıran birçok (çok) uzantıya sahiptir. Bu aynı zamanda geçiş yapmak için mükemmel bir neden ve bir problemdir:
ls *(.)(diğer kabukları ile zordur). Yeterince derinden baksam bile, cevap zsh ( print -rl -- *(/)) içinde de karmaşık hale gelir .Con zsh:
Sonunda, bu senin seçimin ve ben her zaman daha fazla seçenek sevdim.