Tüm bash scriptleri `zsh` ile uyumlu mu?


Yanıtlar:


55

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.


1
Geçiş yapmanın en zorlu kısmı neydi?
Chrisjlee

4
Yok. Kişisel komut dosyalarım bash için uygun referansı ekledi ve başlamak için iyi bir .zshrc bulmuştum. Zsh ve bash, onu gerçekten zorlayıcı bulmadığım için yeterince benzerdi.
Huygens

4
Eğer listeleyebilirsiniz .zshrc:)
neaumusic

Ancak #!/bin/bashkomut dosyası gibi çalıştırıyorsanız satır göz ardı edilirse source ./script.sh?
LCB

3
Kabuğa giden yolu zorla kodlamak, sık sık yapılsa bile kötü bir tavsiyedir. Bunun #!/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.
Konrad Rudolph

29

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.


1
Kullandığınız kabuk alakasız eğer sen gibi komut dosyalarını çalıştırmak ./my_script.sh. source my_script.shve . my_script.shonu çalıştıracak herhangi bir Shebang'ı görmezden, mevcut kabuk olarak.
BallpointBen

3

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:

  1. Pro zsh

    • Bir sekmeye basarak komut sözdizimi seçeneklerini görmek çok güzel.
    • Zsh'nin diğer bir büyük yararı, bir yazım hatası yaptığınızda hata düzeltmedir. Sadece hata görüntülemek yerine: komut bulunamadı, zsh yazmaya çalıştığınız şeyi yorumlamaya çalışacaktır. zsh bu girişi geçerli bir komut olarak kabul edecektir.
    • Ayrıca, zsh geniş bir çözüm yelpazesine olanak tanıyan genişletmeler için birçok değiştiriciye sahiptir . Gibi: sadece dosyaları listeler: ls *(.)(diğer kabukları ile zordur). Yeterince derinden baksam bile, cevap zsh ( print -rl -- *(/)) içinde de karmaşık hale gelir .
    • Yüzdürme ile matematiği kabul edin (bazı uyarılarla).
  2. Con zsh:

    • Bash, birçok sistemde varsayılan kabuktur.
    • Birçok zsh seçeneği, bash uyumlu komut dosyaları yazmaya doğrudan yardımcı olmaz.
    • Aynı anda iki mermiyi öğrenmeye çalışmak bile büyük bir sorun olabilir.

Sonunda, bu senin seçimin ve ben her zaman daha fazla seçenek sevdim.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.