Sh'in tire ile bağlantılı olmasının amacı nedir?


35

Ben ne anlamı merak ediyorum shsembolik ile bağlantılı olduğundan dashmı? Bundan dashdaha hızlı olması gerektiğini biliyorum bash, ancak orijinal shkabuğun neden bulunmadığından emin değilim sh.

Ya da neden bir şeyle shbağlantılı değilse bash?

Yanıtlar:


70

“Orijinal sh kabuğunun neden bulunmadığına” dair kısa cevap, orijinal sh olmadığı sh.

Tamam, işte var: bu Thompson kabuğu . Versiyon 1 bugün bildiğimiz bazı özelliklere sahipti, özellikle yönlendirme ve borular ( Dennis Ritchie'nin erken Unix tarihine dair makalesini oku ). Daha sonraki sürümlerde , arka planda yürütme &, globbing (harici bir programla uygulanır) ve bazı alıntı biçimleri gibi özellikler eklendi , ancak değişkenlere veya iç içe geçmiş kontrol yapılarına sahip değildi. Şartlı Cümleler ve döngüler, harici programlar if(bir koşulu ve bir komutu argüman olarak aldı) ve goto(üst dosyasının komut dosyası dosyasındaki konumunu değiştirerek çalıştı ) sağlandı .

1979, in Unix V7 , Thompson kabuk olarak değiştirildi /bin/shile Bourne kabuğu . İlk sürüm , günümüzün çizgi kısmında mevcut olan birçok özelliğe sahipti ve daha sonraki sürümlerde daha birçok tanıtıldı . Birkaç yıl sonra, Korn kabuğu sahneye, artan bir özellik seti ile geldi; birçok Unix türevi onu ad altında yüklüyordu ksh.

1992'de POSIXsh , temel olarak Bourne ve birkaç şey içeren minimum bir dizi özellik kodladı . Kendisini “Unix” olarak adlandıran herhangi bir sistem, en azından bu özellikleri uygulamak zorundaydı. Ticari Unix sistemleri genellikle POSIX sh olarak ksh kullandılar, ancak bir kaçının (örn. OSF / 1 ) kendilerine sahipti.

Ne Bourne kabuğu ne de Korn kabuğu son zamanlara kadar açık kaynak kodluydu, bu yüzden Linux dünyası 1990'ların ortasında oluşmaya başladığında mevcut değildi. /bin/shbaşka bir şey olmalıydı. Linux dağıtımlarının çoğu , betik özellikleri açısından Bourne ve Korn arasında olma eğiliminde olan GNU projesinin bir kabuğu olan ve etkileşimli kullanım için olduğundan daha iyi olan bash için gitti . Tek uygun alternatif bir serbest pdksh ( “kamu malı Korn kabuk”) idi (şimdi durdurulan, ancak yaşayan mksh edilir aktif gelişmiş ), ama ben pdksh kullanarak bir Linux dağıtımı hatırlamıyorum/bin/shNedenini bilmiyorum, sanırım Linux dağıtımları her zaman GNU / Linux dağıtımlarıydı, temel olarak bir GNU versiyonunun var olduğu herhangi bir aracın GNU versiyonlarını gönderiyordu.

Ayrıca, shözellikle de Almquist kabuğu olan “kül” olarak adlandırılan birçok açık kaynak uygulaması vardı, ancak insanların kullanmak istediği bazı POSIX özelliklerinden yoksun kaldılar. Debian'ın sağlayıcısı olan bir programcı Herbert Xu , POSIX ile uyumlu hale getirmek için külü uzattı. Sonunda versiyonunun çizgi olarak değiştirildi ve /bin/shDebian'da bash yerine bunu yapmak için bazı baskılar vardı. Debian sistematik tedavi bashisms (içinde bash özgü işlevsellik kullanımı başlamadan önce Ubuntu başladı #!/bin/shgibi komut dosyaları) böcek . Hem daha sonraki (anahtarlamalı Ubuntu 6.10 , Debian sadece 2009 yılında ( o lenny için kale oldu ancak, anahtar yalnızca lenny serbest bırakıldıktan sonra yapıldı, yani sıkıldı)).

Önemli bir çizgi olarak yerine bash kullanarak nedeni olarak /bin/shönemli ölçüde daha hızlı olmasıdır. Bu özellikle, başlangıçtan beri önyükleme sürelerini kısa tutmaya çalışan Ubuntu için önemliydi. Dash, bash'a göre daha az bellek kullanmaya meyillidir; bu, temel program çıktığında sadece biraz temizleme yapmak için etrafta kalan sarmalayıcı komut dosyaları için biraz önemlidir. Çizginin bir diğer faydası ise, sadece libc'ye (çekirdek sistem kütüphanesi) dayanmasıdır, bash da terminal destek kütüphanelerine dayanmaktadır (onlar olmadan bir betiği çalıştırmak için bile başlayamaz); Bunun anlamı, kısa bir sistemde çalışmaya devam etmek için bu çizginin daha iyi bir şansı olduğu anlamına gelir.

21. yüzyılda bir noktada, Korn kabuğu açık kaynaklı oldu ve Bourne kabuğunun açık kaynaklı versiyonları ortaya çıktı (eski versiyonlar, çünkü gelişme yıllar önce durdu). Ancak çizgi ve bash, Linux dünyasında, kabul görmeleri için, özellikle de bugünkü değeri yalnızca tarihsel olduğu için, Bourne kabuğuna sert bir şekilde sarıldı. Dash, yerinden oynatılan bash'ın net yararları olduğu için yer değiştirdi, ancak diğer yarışmacıların hiçbirinin belirleyici bir avantajı yok /bin/sh.


Ksh93'ü / bin / sh olarak kullanmak için iyi nedenlerin olduğunu iddia ediyorum - mevcut en yüksek performanslı POSIX mermilerinden biri. Bu çizgi her yerde her zaman bir mesele olduğunu kabul etti.
Charles Duffy

2
@CharlesDuffy Ksh93 karmaşık işlerde daha hızlıdır, ancak kısa süre önce kısa çizgi çizer ve basit komut dosyaları için system(uygulamaların yaptığı tüm çağrıları (3) yaptığı gibi) en önemli faktör budur.
Gilles 'SO- kötülük yapmayı bırak'

21

Hız ve POSIX uyumluluğu (diğer bir deyişle taşınabilirlik) ana faktörlerdir. Unutmayın /bin/sh, Ubuntu ve / veya diğer sistemlerin eski sürümlerinden gelen veya gelmeyen sistem komut dosyaları içindir.

Tabii ki, parlak özellikleri bashbizim için kullanmak çok güzel, ancak birkaç farklı sunucu / sistemi yönetmeniz gereken ortamda çalışan bir şey söz konusu olduğunda - POSIX uyumlu bir kabuğa sahip olmak çok büyük bir fark yaratıyor. Özellikle, eğer yeni bir sysadmin ve birçok komut dosyası ile miras kalmış bir ortamsanız.

Orijinal Bourne kabuğunun neden bulunmadığına gelince, basittir - orijinal AT&T Bell Labs'a ait tescilli bir üründür.

Ayrıca, Ubuntu wiki hakkında bununla ilgili açık bir açıklama var:

Bu değişiklik neden yapıldı? Varsayılan kabuğu değiştirmenin ana nedeni verimlilikti. bash etkileşimli kullanım için uygun mükemmel bir tam özellikli kabuktur; Gerçekten de, hala varsayılan giriş kabuğu. Ancak, başlatmak ve çalıştırmak için tire ile karşılaştırıldığında oldukça büyük ve yavaştır. Ubuntu önyükleme işleminin bir parçası olarak çok sayıda kabuk örneği başlatılır. Ubuntu çekirdek geliştirme ekibi, / bin / dash altında açıkça devam etmek için her birini ayrı ayrı değiştirmek yerine, devam eden önemli bir bakım gerektiren ve yakın ilgi gösterilmezse gerilemekle yükümlü olacak bir değişiklik yerine, Ubuntu çekirdek geliştirme ekibi, en iyi şekilde değiştirmenin en iyisi olduğunu düşündü. varsayılan kabuk. Ubuntu 6.10'daki önyükleme hızı iyileştirmeleri, genellikle init sisteminin gelecekteki gelişimi için iyi bir platform olan Ubuntu 6'daki Upstart'a yanlış bir şekilde bağlandı. 10, öncelikle yalnızca küçük davranış değişiklikleriyle Sistem V uyumluluk modunda çalışıyordu. Bu gelişmeler aslında büyük ölçüde değişen / bin / sh nedeniyle oldu.

Ve işte taşınabilirlik hakkında bir not:

Debian politikası el kitabı, "tercüman olarak '/ bin / sh' belirten kabuk komut dosyalarının yalnızca POSIX özelliklerini kullanması gerektiğini"; Aslında, bu gereksinim Ubuntu projesinin başlangıcından çok önce gerçekleşti. Ayrıca, BSD'ler veya Solaris gibi diğer Unix sistemlerine taşınabilir olması beklenen herhangi bir kabuk betiği zaten bu gereksinimi onurlandırdı. Böylece, bu değişikliğin uyumluluk etkisinin minimum olacağını hissettik.

Bkz https://wiki.ubuntu.com/DashAsBinSh


dashGerekli olmayan özellikleri desteklemiyor mu POSIX?
NerdOfLinux

@NerdOfLinux POSIX'e ek olarak ne / bin / sh'in desteklediği de önemli değil (bu eklemeler POSIX kodlarını bozmadığı sürece); Önemli olan POSIX'in her şeyini desteklemesi (mümkün olduğu kadar hızlı olması). Çizgi bu gereksinimleri karşıladığı sürece / bin / sh buna bağlanabilir.
Guntram Blohm

9

GNU / Linux dağıtımlarında "orijinal /bin/sh" aslında Bash.

GNU, GPL lisansı altında olan Bourne benzeri bir kabuk istedi, bu yüzden /bin/shGPL lisanslı olmayan Bourne yerine Bash'i seçtiler . Modern Linux dağıtımı, bu kararı /bin/shBash olmak için bir standart haline geldiği noktaya devraldı . Orijinal Bourne kabuğu ("sh"), Linux olmayan diğer Unix'lerde, Solaris 10'a kadar kullanılsa da kullanılmıştı, ancak hiçbir zaman Linux dağıtımlarında bir dayanak noktası olmadı.

Bash'tan /bin/shkısa çizgiye geçmek , büyük oranda hız ile harekete geçen bir Debian (Ubuntu tarafından miras alınan) karardı; init komut dosyaları.

Bash, kullanıcılar için varsayılan etkileşimli / giriş kabuğu olarak kullanılmaya devam eder, ancak Dash, /bin/shinit betikleri gibi sistem betikleri için yürütülen ve Dash'dir.

Kısa çizgi çok hızlı, ancak aynı zamanda çok yakın POSIX uyumlu - Bourne kabuğu ile yakından uyumlu bir standart. Yani bir şekilde Bash'den Dash'a geçerek Bourne ile daha yakın bir kabuğa geri dönüyoruz.


"Dash çok hızlıdır, ama aynı zamanda çok yakından POSIX uyumludur -. Bourne kabuğu ile yakın hizalanmış bir standart" Evet, POSIX daha yakından ilgilidir olmasına rağmen ksh, diyebilirim. Bourne kabuğunun POSIX olan $ (()) `nın aritmetik genişlemesine sahip olduğunu hatırlamıyorum.
Sergiy Kolodyazhnyy 14:17

1
Ayrıca, Bourne, ^bir boru karakteridir - yani echo foo ^ catyayacaktır foo ^ catPOSIX sh, ama fooBourne; Bu özel test, Autoconf'un bu ikisini birbirinden nasıl ayırdığıdır.
Charles Duffy,

İlginç, yani POSIX sh ile Korn demek istiyorsun?
thomasrutter

0

/bin/sh/bin/dashuyumluluk nedenleri olduğuna inandığım şeyle bağlantılı . Birçok komut dosyası ile başlar

#!/bin/sh

öyleyse, dashsembolik bir bağlantıya gidip gelmeyerek, pek çok komut dosyası, eğer /bin/shhiç mevcut değilse , düzgün bir şekilde (veya hiç) çalışmaz.

Değişiklik yapılmıştı bashiçin dashuygun çünkü https://wiki.ubuntu.com/DashAsBinSh :

Varsayılan kabuğu değiştirmenin ana nedeni verimlilikti. bash etkileşimli kullanım için uygun mükemmel bir tam özellikli kabuktur; Gerçekten de, hala varsayılan giriş kabuğu. Ancak, başlatmak ve çalıştırmak için tire ile karşılaştırıldığında oldukça büyük ve yavaştır. Ubuntu önyükleme işleminin bir parçası olarak çok sayıda kabuk örneği başlatılır. Ubuntu çekirdek geliştirme ekibi, / bin / dash altında açıkça devam etmek için her birini ayrı ayrı değiştirmek yerine, devam eden önemli bir bakım gerektiren ve yakın ilgi gösterilmezse gerilemekle yükümlü olacak bir değişiklik yerine, Ubuntu çekirdek geliştirme ekibi, en iyi şekilde değiştirmenin en iyisi olduğunu düşündü. varsayılan kabuk.

shbağlantılı değil bashçünkü

Debian politikası el kitabı, "tercüman olarak '/ bin / sh' belirten kabuk komut dosyalarının yalnızca POSIX özelliklerini kullanması gerektiğini" zorunlu kılmıştır.

bashOlarak kullanmak istiyorsanız /bin/sh:

Sorunlar daha yaygınsa ve varsayılan sistem kabuğunu geri değiştirmek istiyorsanız, paket yönetim sisteminden "/ bin / sh" komutunu yüklemeyi bırakmasını isteyebilirsiniz:

sudo dpkg-reconfigure dash

dashBash'ın yapmamasını sağlayan bazı özellikler vardır :

Artık, bash'ın sağlamadığı bazı çizgi özelliklerine bağlı birkaç senaryo olması dışında bile bir şans var!


Uyumluluğun bir faktör olabileceğini zaten anladım ama çok açık ve net bir cevap
aramıyordum

2
Bu yüzden orijinal Bourne kabuğu yüklemek olsaydı shiçin /bin/sh, olur o çizme komut kadar bu vida?
tatlı

Muhtemelen gerçek dünyaya konuşlandırmadan önce bunu sanal bir makinede denemek en iyisidir ...
NerdOfCode 14:17

2
/bin/shDağıtımın sağladığı kabuk olarak, önyükleme komut dosyaları ve benzerleriyle hedefledikleri gibi ayrılmalısınız . Ancak Bourne ile değiştirdiyseniz, çoğunlukla uyumlu olurdu. Ancak, yalnızca büyük miktarda kodla olan dakika farkları nedeniyle, kırılmalar olacağını hayal ediyorum. Elbette, kendi betiğinizde hangi kabuğu kullanırsanız, özel bir hashbang ile özgürsünüz.
thomasrutter

1
@mckenzm Hangi kabuk /bin/shbağlantıları, belirli bir kullanıcının ilk giriş kabuğu olarak belirlediklerinden ayrıdır. Hedef /bin/shkullanıcı bakıyor hangi bağlıdır ve yok yapmak kullanma ihtiyacı sudokök kullanıcı olarak davranan diğer bazı araçlar OR - bunu değiştirmek için. Ayrıca, genel olarak ve herhangi bir paket için dpkg-reconfigurekök olarak çalıştırılmalıdır. Buna karşılık, kullanıcıların genellikle kendi başlangıç ​​oturum açma kabuğunu değiştirmelerine izin verilir ve bunu chshkomutla yapabilirler. Kişinin ilk giriş kabuğunun adı da girilir $SHELLve etkileşimli giriş olmayan bazı kabukları için de kullanılır.
Eliah Kagan
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.