Bassh'ı zsh üzerinden kullanmak için herhangi bir sebep var mı? [kapalı]


33

Neden birinin zsh yerine bash yapmak istediğini merak ediyorum. Zsh, bash ile tamamen geriye dönük olarak uyumludur. Beni yanlış anlama: bash veya hiçbir şeyden hoşlanmıyorum. Ben sadece gerçekten zsh üzerinde kullanmak herhangi bir avantaj olup olmadığını bilmek istiyorum.

Öyleyse bash'ı zsh üzerinde kullanmak için hangi sebep var?


2
Sadece ZSH'nin BASH ile geriye dönük olarak tam uyumlu olmadığını belirtmek istedim. ZSH'de, dizi indeksleme BASH'de 1 - 'de başlar, dizi indeksleme 0 ile başlar. Başka farklılıklar da var, ama bunu belirtmek istedim.
Charles Addis,

Yanıtlar:


29

Akla iki sebep geliyor:

İlk - hemen hemen her yerde kullanılabilir. Zsh kurulu olmayan birkaç Linux sistemim (bu durumda CentOS 4.x) var. Benzer şekilde Solaris 2.6 ve üzeri, HP-UX 10 ve üzeri gibi eski sistemlere ve AIX'in benzer sürümlerine dokunmalıyım. Bu yüzden bu bilgisayarlarda bash kullanmak zorundayım, ki bunu yapmaktayım çünkü bir ay boyunca yüzlerce olmasa da onlarca kişiye dokunuyorum ve arayüzünüzde tutarlılığı sağlamak için varsayılan.

İkincisi - hemen hemen her yerde kullanılabilir. Bu, bir bash shell betiği yazabildiğim ve% 99 başka bir yere aktarıldığında çalışacağından emin olacağım anlamına gelir.

Evet, bu sebepler yüzeysel olarak aynı, fakat onların arkasındaki sebep farklı.


2
HPUX üzerinde ksh88 / ksh93 olduğunu hatırlıyorum, bash kurulumuna asla erişemedik.
Zlemini

24

Bash genellikle her sistemle birlikte gelir, zsh değildir. Zsh'yi seviyorum, ancak bu nedenle etkileşimli kullanım için zsh'yi, tüm komut dosyalarım için de Bash'i kullanıyorum .

Bunu, bash ile uyumlu ne olursa olsun (setopt SH_WORD_SPLIT?) Alışveriş yaparken bile, hala ince farklarla karşılaşıyorum.


3
Demek istediğin her GNU / Linux sistemi bu mu?
andol

2
Peki OS / X ve bsd ile geldiğini öğrendim, diğer * nix'lerle fazla bir tecrübem yok, onlar (son sürümleri) genellikle bash yok mu?
Kyle Brandt

1
Daha eski Solaris versiyonlarında bash yoktu; Tipik olarak Bourne'un komut dosyası için kabuk olmasına bağlıydım. Bu bir süredir böyle olmamış, ancak bazı büyük işletmelerde hala karşılaşabilirsiniz.
kullanıcı5336

3
Farklı BSD olmalı: o zaman. En azından OpenBSD'de ve FreeBSD'de bash'ı portlardan / paketlerden ayrı kurmanız gerekir.
andol

andol: Bunlar eskiden kullandıklarım .. Yanlış hatırlamam gerekiyor ya da yaptım ve hatırlamıyorum.
Kyle Brandt,

13

zsh tamamen bash uyumlu değil. Çeşitli farklılıklar var. Daha yeni zsh bash ile daha uyumludur (= ~ desteklenir, yürütme şimdi ekstra bayrak seçeneklerine sahiptir, vb.) Ancak tam uyumluluk "öykünme" altında bile bir amaç değildir.

Örneğin, bash substring $ {foo: offset: len} 'dır, ancak zsh'de $ foo [start, end] ve bu sadece basit bir örnektir.

zsh, birçok şeyi kendi yöntemiyle yapan bir tcsh ve ksh etkilenmiş kabuktur; POSIX uyumluluğu açıkça bir amaç değildir, ancak geliştiriciler, POSIX'e yaklaşan seçenekler / taklit davranışlar ekleyen yamalar için duyarlıdır. Fakat gerçekten kabuğun gücüne girmeye başladığınızda, bashtan bile öte salt okunur komut dosyaları oluşturmaya başlarsınız.

bash POSIX sh + ksh + pedanticism'dir, bazı özellikler şimdi zsh'den kopyalanmıştır. Aynı zamanda sadece yazma komut dosyalarına sahiptir, ancak daha az güçlü operatörlere sahip olduğu için, zsh'ın özlülüğünü kullanmazsınız ve işler daha okunabilir olabilir (boşlukların bölünmesini önlemek için yapılan alıntılar hariç, aptal ksh tarzı $ dizisi önce gelir) -dize-dizisi, dizinin tümü-öğeleri değil, vb.

Kısıtlı bir ortamda olmadığınız sürece, her iki kabuğun gücünden tam olarak faydalanan komut dosyaları yazmak (örneğin, bazı FS'lerin monte edilemeyeceği sistem rc komutları yazmak, vb.). İdeal olarak, başkalarının bakımını yapmalarını istiyorsanız, Bourne sh'de ifade etmemeniz gereken yeterince büyük bir şey için Perl / Python / Ruby / kullanın. Kabuk malzemelerini etkileşimli kabukla ilgili şeyler için saklayın (sekme tamamlama programlaması vb.).

Ben zh üzerinden bash kullanmam. Basit betikler için zsh üzerinde çıplak sh kullanır veya ilişkisel dizilerin iyi işleçleri olan bir dile geçerim (zsh'den farklı olarak, 'özlü' oldukları yerde). Ben belki ben küçük bir özellik mevcut bir kanıtlanmış çalışan senaryoyu uzatmak için ve şimdi yeniden yazmak için zaman yok gerekirse bash bir sh komut dosyası açın.


6
nb: $ {foo: offset: len} edilir şimdi uyumluluk için, zsh içinde destekledi.
Phil P,

6

Tavsiyem: mutlak taşınabilirlik için gidiyorsanız, Bourne mermisi kurallarını kullanarak yazınız, Korn mermisi uzantılarıyla uğraşmayın bile. Bahsettiğim gibi, bunlar üzerinde GNU mermisi bulunmayan bazı eski "büyük kutular" dır.

Bash zaten "çok fazla" yapıyor. İşyerinde Zsh'yi tercih eden bir arkadaşım var, ama tam olarak ne yaptığını bilmiyorum.

Her neyse, ya Bourne (ya da "bourne") kabuğuna yazın ya da alternatif olarak, az sayıda belirli kutu için özel bir komut dosyası kullanıyorsanız, "kabuk cehennemini" tamamen atlayın ve sadece perl ya da python kullanarak yazın (ya da her neyse favori yerel olarak kurulmuş tercüman).


5

Yukarıda verilen taşınabilirlik sebebine ek olarak, bir diğeri bash hala özellikler ekliyor olabilir.

Örneğin bash v4.x + tanıtıldı:

  • özyinelemeli globbing:

    rm -f ** / * kütüğü

  • autocd:

    "Cd / tmp" yerine "/ tmp" yazın.


2
Bash özellikleri zsh'dan bash kullanımı için bir neden nasıldır?
qqx

5

Bu arada, birçok kez pratik olarak bash'ın her yerde bulunduğu söylendi, bu yüzden yanlış olan taşınabilir komut dosyaları yazmak için kullanın.

Saçmalık. Önemsediğiniz her sistemin BASH olduğunu biliyorsanız, bu tamamen makul bir ifadedir. BASH, POSIX sh’te makul şekilde taklit edilemeyecek birçok kullanışlı özelliğe sahiptir. POSIX dışı özelliklerin anlamsız kullanımı iyi bir fikir değildir, ancak gerçekten ihtiyaç duyduğunuzda bunları kullanmak iyidir.

Taşınabilirlik mutlak değildir. Ne kadar ileri götürmeniz gerektiği, başka bir şey gibi. Örneğin, Fedora, RPM paketleri oluşturmak için kabuk komutları kullanır ve Fedora paketleme kuralları, tüm paketlerin yerel olarak Fedora üzerine inşa edilmesi gerektiğinden, BASH'ın tüm özelliklerini kullanmanın uygun olduğunu belirtir. Teorik olarak BASH içermeyen diğer dağıtımlar kaynak RPM'lerini tekrar kullanmak isteyebilse de, "HER ZAMAN UZE POSIX !! 1" mantranız yerine pratiklik temelinde taşınabilirlik konusunda karar verdiler.

ZSH varsayılan bir kabuk olarak yakalanmadı, çünkü yarı pişmiş fikirlerin yaydığı karışıklık yüzünden.


2
Zsh içindeki hangi özelliklerin veya fikirlerin yarı pişmiş olduğunu ve neden olduğunu açıklayabilir misiniz?
Funroll

2

Bu arada, bashpratikte her yerde bulunan birçok kez burada size söylendi , bu yüzden yanlış olan taşınabilir komut dosyaları yazmak için kullanın .

Taşınabilir unix komut yazmak için doğru yol kullanımı için sh, her * nix sistemde bulunursa .

Bunun dışında her diğer kabuk shsadece günlük interaktif bir araçtır.

İçin gelirken bashvs zsh- bashdaha gruplanmışsa *nixesdaha zsh, işte sisteme ek yazılım yüklemeden dezavantajlarını geliyor - bunu sürdürmek zorundayız. Bazı insanlar zsh'ı "harika özellikler" seviyorlar, bu yüzden bu bedelleri ödemek istiyorlar, bazıları değil.


2
Sh'ın birçok modern uygulaması sadece bash bağlantısıdır.
user9517, GoFundMonica

2
@Iain Ubuntu varsayılan olarak çizgi kullanır ve shbash olsa bile , çalıştırıldığında uyumluluk modunu etkinleştirir sh.
mgorven

2

Başka bir nokta:

Birçok program varsayılan olarak soğuk bas tamamlama sağlar. Benim için değişmemenin nedeni bu.

[Temmuz 2013'de eklendi] Yukarıdaki yorumdan bu yana birkaç yıl zsh kullandıktan sonra, sekme tamamlamanın (yerleşik bile olsa, 3. parite değişiklikleri olmadan) mükemmel olduğunu ve bash tarafından sunulanın çok ötesinde olduğunu söylemeliyim. . :).


3
ZSH ile de çalıştığını düşünüyorum, ZSH'de sekme işlemi tamamlandığında, birçok programa özel argüman alıyorum ...
Kyle Brandt

İlginç. Bash tamamlama dosyalarının zsh ile çalıştığını mı düşünüyorsunuz, yoksa sadece bazı programların zsh'ye özgü tamamlama öğeleri var mı? Yine de, zsh'nin otomatik olarak düşünebileceği veya düşünmeyeceği bazı bash tamamlama dosyalarının std düzeni var. Çalışması için zsh config'nizi değiştirdiniz mi?
Wojciech Kaczmarek

@Wojciech Kaczmarek: 19.3'i aşağıdakilerden istediğinizi düşünüyorum: zsh.sourceforge.net/Doc/Release/zsh_19.html . Dürüst olmak gerekirse, onu gerçekten anlamak için hiç zamanım olmadı, sadece çevrimiçi bulduğum bir .zshrc'yi söktüm :-) Ama apt, grep, vb. Gibi programlardan komut satırı argümanlarını tamamlayacak ....
Kyle Brandt

5
bash'in sekme tamamlaması zsh'ın eski sekme tamamlama sistemine çok benziyor. Bu, zsh'den bash'a kopyalanan fikirlerden biridir (bash'dan zsh'ye kopyalanan başkaları da vardır). "Bashcompinit" komutunu kullanarak ve sonra zsh içindeki "complete" ve / veya "compgen" komutlarını kullanarak bash için yazılmış tamamlama komut dosyalarını kullanabilirsiniz - bu mümkündür, çünkü bash işlevi zsh ve öyleyse taklit edilebilir. Bu yüzden bash'a geçmenin bir nedeni yok çünkü bir komut bash tamamlanmış olarak geliyor.
Phil P
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.