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/bash
komut dosyası gibi çalıştırıyorsanız satır göz ardı edilirse source ./script.sh
?
#!/usr/bin/env bash
yerine, ö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 sh
veya 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ı .bashrc
değ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 .bashrc
Or .zshrc
ve 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 sh
yerine emulate ksh
sizin 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.sh
ve . my_script.sh
onu çalıştıracak herhangi bir Shebang'ı görmezden, mevcut kabuk olarak.
Eğer shebang ise #!/bin/bash
ve senaryonun baslatilmasi gibi ./script
senaryonun bash tarafından çalıştırılacağı gibi. Kesinlikle burada sorun yok.
Ancak, zsh ./script
onu . ./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 prompt
zsh'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.