Bash scriptleri yerine zsh kullanılması önerilir mi? [kapalı]


25

Bir zshkomut dosyası çalıştırmak için yeterli sayıda kişi yüklediğini varsayabilir miyim

#!/usr/bin/env zsh

Shebang olarak mı?

Yoksa bu, komut dosyalarımın çok fazla sistemde çalıştırılamaz olmasını sağlar mı?

Açıklama: Bir son kullanıcının çalıştırmak isteyebileceği programlar / scriptler ile ilgileniyorum (Ubuntu, Debian, SUSE, Arch & c. Gibi)


4
Tuhaf soru. Hedefin kim? Bazı çevrelerde (Ruby on Rails web geliştiricileri) zshpopüler olabilirken, diğerleri (bankacılık sektörü) neredeyse hiç duyulmamıştır. Bu konuda uygun bir tavsiyeye ihtiyacınız olursa daha fazla bilgi vermeniz gerektiğini düşünüyorum.
rahmu

Genel linux son kullanıcı dünyası.
Profpatsch

2
WRT "genel linux son kullanıcı dünyası", zsh standart değildir. Varsayılan olarak kurulmaz (dağıtımların çoğunda veya hepsinde) veya herhangi bir şey için zorunludur, bu yüzden çoğu insan buna sahip olmaz.
goldilocks

3
Ben var yok zshyüklü herhangi benim sistemlerinin, ve bir tek komut dosyası için yüklemek olmaz. Bash genellikle mevcut olsa bile, bazitlerden bile kaçınmalısınız.
frostschutz 27.03.2013

Yanıtlar:


29

Taşınabilirlik için hayır. Her zshne kadar Unix veya Unix benzeri ve hatta Windows'ta en azından Cygwin üzerinden derlenebilir ve çoğu Açık Kaynak Unix benzeri ve birçok ticari ürün için paketlenmiş olsa da, genellikle varsayılan yüklemeye dahil edilmez.

bashdiğer ucunda bashgömülü olmayan Linux tabanlı sistemlerin büyük çoğunluğu gibi GNU sistemlerine ( GNU projesinin kabuğu gibi) ve bazen de Apple OS / X gibi GNU dışı sistemlere kurulur . Ticari Unix tarafında, Korn kabuğu (AT&T varyantı, birçoğu olsa da ksh88) normdur ve her ikisi de isteğe bağlıdır bashve zshisteğe bağlı paketlerdedir. BSD üzerinde, tercih edilen etkileşimli kabuk genellikle tcshise shAlmquist kabuk ya da her iki temel alır pdkshve bashya zshda isteğe bağlı paketler olarak monte edilmesi gerekir.

zshApple OS / X’te varsayılan olarak yüklenmiştir. /bin/shOrada bile kullanılmış . Varsayılan olarak SysRescCD, Grml, Gobolinux ve muhtemelen diğerleri gibi bir kaç Linux dağıtımında bulunabilir, ancak bunlardan hiçbirini düşünmüyorum.

Gibi bash, yüklü versiyonun sorusu var ve sonuç olarak mevcut özellikler. Örneğin, bash3veya ile sistem bulmak nadir değildir zsh3. Ayrıca, şu anda yazdığınız komut dosyasının geriye dönük uyumluluğu sağlamaya çalıştıkları gibi zsh5çalışacaklarına dair hiçbir garanti yoktur .zsh6bash

Komut dosyaları için benim görüşüme göre: Tüm Unices bu sözdizimini yorumlayabilen en az bir kabuk sh(zorunlu olarak değil /bin) olan POSIX kabuk sözdizimini kullanın. O zaman taşınabilirlik hakkında çok fazla endişelenmenize gerek yok. Ve bu sözdizimi ihtiyaçlarınız için yeterli değilse, o zaman muhtemelen bir kabuğundan daha fazlasına ihtiyacınız vardır.

Ardından, seçenekleriniz:

  • Her yerde bulunan Perl (yine de kendinizi eski sürümlerin özelliklerle sınırlandırmanız gerekebilir ve varsayılan olarak yüklenen Perl modüllerinde varsayımlar yapamazsınız)
  • Tercümanı ve versiyonunu (python 2.6 veya üzeri, zsh 4 veya üzeri, bash 4.2 veya üzeri ...) betiğiniz için bir bağımlılık olarak ya bağımlılığı belirleyen her hedefli sistem için bir paket oluşturarak ya da onu şart koşarak belirtin betiğinizle birlikte gönderilen veya betiğinizin üstüne yorum olarak eklenmiş bir README dosyasında veya betiğinizin başına Bourne sözdizimine birkaç satır ekleyerek istenen tercümanın kullanılabilirliğini kontrol eder ve açık bir hatayla kurtarır olmadığında, bu betiğin zsh 4.0 veya üstü bir sürüm gerektirmesi gibi .
  • Tercümanı betiğinizle birlikte gönderin (lisans uygulamalarına dikkat edin), bu da hedeflenen her işletim sistemi için bir pakete ihtiyacınız olduğunu gösterir. Bazı tercümanlar, komut dosyasını ve tercümanını tek bir çalıştırılabilir dosyaya paketlemek için bir yol sağlayarak kolaylaştırır.
  • Derlenmiş bir dilde yazınız. Yine, hedeflenen sistem başına bir paket.

"zsh-man" "hayır" diyerek, seninle gurur duyuyorum! ^^ Taşınabilirlik ftw! (Tüm uyarıları ile ...). +1.
Olivier Dulac

9

Hayır yapamazsın. Temin edilen /bin/sh, esasen orijinal Bourne kabuğudur. Hemen hemen hepsi ("neredeyse" not alın!) Linux kurulumlarında bash olacaktır, ancak * BSD sistemlerinde nadirdir (BSD'nin bash gibi GPL koduyla ilgili ciddi yanlışlıkları vardır). Mac'te standart kabuğun ne olduğunu bilmiyorum, ancak yine de GPL ile ilgili endişeler var. Solaris için aynı.

zsh bir niş kabuktur, Fedora'nın varsayılan kurulumunda değildir (ve herhangi bir büyük dağıtım için varsayılan olduğuna inanmıyorum).


6
Tabii ki orijinal Bourne Shell değil, Posix uyumlu sistemlerde bir Posix kabuğu değil, çoğu sistemde / bin / sh, ancak mutlaka olması gerekmez (Solaris <= sürüm 10'da bu / usr / xpg4 / bin / sh)
Scrutinizer

Eh, "varsayılan" yükleme gerçekten önemli değil. Önemli olan, eğer yüklü ise.
Profpatsch

@Profpatsch, sonra varsayılan yükleme çok önemlidir (muhtemelen dağıtım insanların ne kullandıklarını belirler).
von

2
@StephaneChazelas, "niş" içinde "az sayıda kullanıcının kullandığı" / "az sayıda montajda var". Dilimli ekmekten bu yana en iyi kabuk olabilir, ancak yalnızca küçük bir kesir kullanırsa, her yere yerleştirileceğini hesaba katamazsınız.
von

1
Not Linux büyük çoğunluğu günümüzde gömülü dağıtımları olduğunu düşünecek olursak (, yazıcılar, yönlendiriciler, TV'ler, ampülleri ... android düşünün) o Linux tabanlı sistemlerin büyük çoğunluğu yok değil var bashbu sistemlerin muhtemelen ana olmasalar da ( OP'nin sorusu için aklında bulunduğunu hedefledik)
Stéphane Chazelas

2

Ben gerçekten ne olduğuna bağlıdır düşünüyorum ZSH kullanmakta ve konum ekstra özellikleri. Komut dosyanızı farklı kullanıcılar ve sistemler arasında dağıtmayı planlıyorsanız, bash veya hatta sh kullanmanızı öneririm .

Komut dosyanız kuruluşunuzda yürütülmek üzere tasarlandıysa ve makinelerinizde zsh bulundurma konvansiyonuna sahipseniz (örneğin aynı temel AMI) ve göreviniz, gelişmiş dosya seçicileri veya http: / /www.rayninfo.co.uk/tips/zshtips.html Devam edin derim!


1

Belirtildiği gibi, bashçoğu dağıtım için varsayılan kurulumda yaygın olarak bulunur. Komut dosyanız güvenerek en büyük kullanıcı tabanına erişemez zsh.

Komut dosyanızı tasarlamadan önce yanıtlanması gereken önemli bir soru " Bir komut dosyasının hangi kabuğu çalıştırdığı neden önemlidir? "

Farklı mermiler, farklı sözdizimi kullanır veya diğer mermiler tarafından desteklenmeyen ilave mermi işlevleri sunar. "Genel linux son kullanıcı dünyası" için bir komut dosyası yazmak için, komut dosyanızın belirli bir kabuk ortamına dayanan sözdizimi veya kabuk işlevlerini kullanıp kullanmadığını belirleyin.

Örneğin, bashkabukdash , Bourne kabuğu tarafından desteklenmeyen bazı açılımları veya /bin/shkullanıcının sisteminde ne varsa onu destekler .

$ ls -l /bin/sh 
lrwxrwxrwx 1 root root 4 Feb 19  2014 /bin/sh -> dash

Yürütme deneyin echo {1..10}ile /bin/shkarşılaştırıldığında /bin/bashve çok farklı çıktı alırsınız.

Aynı şey zsh, çoğu bashsözdizimini desteklerken, bashkabuk tarafından desteklenmeyen ek genişleme ve sözdizimi de sunmakta . Özel örnekler için mermileri karşılaştıran tablolara bakınız .

Potansiyel kullanıcı tabanınızı bash, çağrıldığında çalışan komut dosyalarına bağlı kalarak daha da genişletebilirsiniz #!/bin/sh -u. Bununla birlikte, bu şu soruyu sormak için bir başka önemli soruyu ortaya çıkarıyor: " Daha fazla taşınabilirlik karşılığında ne feda ediliyor? "

Güvenlik endişeleri, işlevsellik, verimlilik veya diğer herhangi bir şey ile ilgili farkınızın senaryo için öncelikli olup olmadığını feda etmeye değeceğini belirleyin. Daha fazla ortamda çalıştığı için bilinen bir güvenlik açığına sahip bir komut dosyasının yaygın şekilde kullanılmasını istemeyebilirsiniz.

Komut kabukları karşılaştırılırkenbash bu komut için bu komut için çok sayıda komut dosyası yazılır . Komut dosyanızı çalıştırandan veya bir kabuk ortamına özel olan herhangi bir sözdiziminden daha çok kişi çalıştırabilir .zsh

Ayrıca, nihayetinde kullanıcının komut dosyasını nasıl çalıştığını kontrol edemeyeceğinizi unutmayın (ayrıca komut dosyalarını farklı kabuklarda hata ayıklamak için de yararlıdır ):

Bir kabuk betiğini okumak için bir kabuk kullanıyorsanız (“sh scriptname”), doğrudan yürütmek yerine (“./scriptname”), kabuk komut dosyasının başlangıcındaki tüm yorumları yorum olarak değerlendirir. Özellikle, komut dosyasını çalıştırırken kullanılacak tercümanı belirten yorum (“#! / Bin / sh -u”), bu tercümanın yanında listelenen seçeneklerin tümü gibi göz ardı edilir.

Dolayısıyla, bu konuda yapabileceğiniz en iyi şey, komut dosyalarınızı taşınabilir yapmaktır, nasıl çalıştığı konusunda büyük bir fedakarlık olmadığı sürece.

Ayrıca Bash kodlama kurallarını da görebilirsiniz - Yığın Taşması .


1
“Ne feda ediliyor?” ... autoconf'a bakın. Tüm kabukları (minik) özellik kümesini desteklediğinden, "Orijinal Bourne Kabuğu" nda olduğu gibi / bin / sh'yi hedeflediler. Ve bunun için çok acı çektiler.
Jürgen A. Erhard

1

Neredeyse garanti edebileceğiniz tek şey bir olmasıdır /bin/sh. Bu aslında statik bağlı bir kabuk olabilir veya başka bir kabuğa bağlantı olabilir. Diğer kabuk genellikle sh olarak adlandırıldığını ve uyumluluk modunda çalışacağını tespit eder.

Neredeyse ilk cümlede dikkat edin .

Üzerinde çalıştığım her unix benzeri sistem vardı. Birçoğunda bash da kurulmuş (ancak hepsi değil . Örneğin bash, bazı BSD'lerde varsayılan olarak kurulu değil. Bazı Linux dağıtımları , Debian Almquist kabuğu olan DASH ile birlikte geliyor.

Garanti edebileceğiniz şey kurulum talimatlarınızdır. README dosyasına zsh gerektiren bir satır ekleyebilirsiniz. Bir paket oluşturursanız, zsh'ı bir bağımlılık olarak işaretleyebilirsiniz. Bunu autoconf / automake araçlarıyla kontrol edebilirsiniz. Zsh'nin kurulum komut dosyasında bulunup bulunmadığını kontrol edebilirsiniz (/ bin / sh ile başlayın ve devam ederse zsh'yi bulmaya çalışın. Bir hata görüntülenmezse. Örn. "Uyarı: ZSH kurulu değil. Lütfen kurulum talimatı dosyasını okuyun! ".)

Birkaç seçenek daha unuttuğuma eminim. Ancak kilit noktalar:

  • Kontrol edene kadar hiçbir şeyi garanti edemezsiniz.
  • / Bin / sh 'ın mevcut olduğu ve bununla ilgili bazı kontroller yapabileceğiniz konusunda neredeyse hiçbir garanti yoktur.

POSIX / bin / sh, AFAIU gerektirir. Bunun gibi birkaç makul yardımcı program gerektirir. Gereksinimleri GNU otokendikasyonunu kontrol edin.
von

@vonbrand. POSIX gerektirmez /bin/sh. Bu bir gerektiriyor shhangi belirtir olarak davranacağını (varsayılan ortam olmak zorunda değildir) Doğru ortamda. /bin/shPOSIX kabuğu olmayabilir. Solaris 10 üzerinde Mesela ve önceki için, hala bir Bourne kabuğu ve standart sholdu /usr/xpg4/bin.
Stéphane Chazelas
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.