Neden hiç kimse gerçek Bourne kabuğunu / bin / sh olarak kullanmıyor?


55

Temelde çalıştığım hiçbir sistemin /bin/shgerçek bir çalıştırılabilir özelliği olmadığını farkettim . Her zaman bir sembolik olduğunu dash, bashPOSIX modunda veya ona benzer bir.

Neden? Doğru, orijinal kullanmanın dezavantajları nelerdir /bin/sh? (Hız? Lisanslama?)


3
Sadece Linux kullandın değil mi? Linux'ta sadece "symlink olarak sh" i gördüm.
Greg Hewgill

Do @GregHewgill Solaris son versiyonları değil shsembolik olarak ksh?
Gilles 'SO- kötülük' dur

1
@Giller cevaplardan birine göre, evet, Solaris 11’den beri ksh.
Strugee,

1
@GregHewgill Ayrıca bashIIRC ile ilişkilendirilen Darwin'i de kullandım .
Strugee,

6
Orijinal / bin / sh ile ne demek istiyorsunuz ? Unix V1'den Thomson kabuğu? Unix V7'den hiçbir işlevi olmayan Bourne kabuğu yorum yapmıyor ...? SysIII, SysV, Solaris, HP / UX'teki, BSD'lerde kül yeniden yapılanma? Günümüzde shbir standarda dayanmaktadır; bu, betiğinizde standart sözdizimini kullandığınız sürece açık bir şekilde davranacak birkaç uygulamaya sahip olabileceğimiz anlamına gelir.
Stéphane Chazelas 18:15

Yanıtlar:


38

Özellik eksikliği olduğunu tahmin ediyorum - komut geçmişi yok, süslü yeniden yönlendirme yok, komut satırı düzenleme yok. BSD cshbu nedenlerden dolayı C kabuğunu tanıttı . Bir başka faktör ise, Orijinal Bourne Kabuğunun sadece son zamanlarda açık kaynak biçiminde mevcut olmasıdır . Eğer lisansını almadıysan, dağıtamazsın. Bu, ücretsiz dağıtımlar için erişilemez hale geldi ve diğer dağıtımlar ve * BSD'ler için ideolojik açıdan hoş olmayan bir hale geldi.

Ancak kod şu anda kullanılabilir . Bir göz atabilir, derleyebilir, döndürebilirsiniz.


50
Sonra derhal daha önce kullandığınız şeye geri dönün.
Ignacio Vazquez-Abrams,

24
@ strugee "" özellik eksikliği "- neden bu bir problem olsun?" Evet, iyi bir nokta ... programcılar neden onlarla yapabileceğiniz bir şey yazarken, meclis / C / üst düzey diller gibi işe yaramaz şeyler kullanıyorlar? makine dili doğrudan mı? Gerçek şu ki: özellikler = geliştirme hızındaki artış + arttırılmış bakım edilebilirlik = daha az maliyet = daha iyi Kullanmak sh, tıpkı kullanım bashdışında olduğu gibidir: yavaş, programlar daha uzun ve bakımı zordur.
Bakuriu

10
Bu aslında özelliklerin eksikliği değil, POSIX gerçeği sh, eski Bourne kabuğunun ne olmadığı, POSIX uyumlu bir kabuk çalıştırma komutunu zorunlu kılar . POSIX shiçinde olmak istemiyor olsa da /bin/sh, olması gereken en mantıklı dizin budur.
jlliagre

4
@Bakuriu komut geçmişi ve komut satırı düzenleme, bir komut dosyası için gerçekten ihtiyacınız olmayacak şeydir.
strugee

4
@ strugee Bunlar tek farklar değil . Örneğin sh, tilde ve ayraç genişlemesine sahip değil, bazı yerleşiklerde eksik (örneğin pushdve popd, select) aritmetik genişleme yok. Örneğin, birçok değişken eksik PIPESTATUS.
Bakuriu

23

Sorunuzdaki ifade yanlıştır. Sürümüne 10'a kadar Solaris olduğu kadar eski gerçek Bourne kabuk sağlayan /bin/sh. Bu, farklı bir kabukla başarısız olabilecek eski komut dosyalarıyla uyumluluğu bozmamak için yapıldı. Aksi halde bu seçim çok sinir bozucuydu.

Solaris 11 de dahil olmak üzere Unix ve Unix benzeri sürümlerin tümü kalmazsa, POSIX uyumlu bir kabuk sağlar; /bin/shçünkü POSIX, uyumlu sholmayan eski Bourne kabuğunu değil POSIX kabuğunu başlatma komutunu zorunlu kılar . /bin/shgenelde :

  • ksh88veya ksh93ticari Unix uygulamalarında
  • değiştirilmiş bashüzerinde OS/X(eskiden olsa zsh)
  • Bir ashya da pdkshdiğer bir türeviBSDs
  • bashveya dashGnu / Linux dağıtımlarında.

Bu mutlaka bir bağlantı değil, birçok sistemde ama Gnu / Linux'ta gerçek bir çalıştırılabilir olabilir.

İlginçtir, sorunuza en fazla cevap verilen cevabı belirtmesine rağmen, dağıtım geliştiricilerin eski Bourne kabuğundan farklı bir şey yüklemelerine neden olan özelliklerin eksikliği değil, POSIX'e /bin/shuygun olma, yani bir gibi davranma arzusu OS gibi Unix. POSIX kabuğunun eski Bourne kabuğundan daha fazla özelliğe sahip olması, bu standart uyum hedefinin yalnızca bir yan etkisidir.

Aynı zamanda, bazı kabukların, özellikle bashçağrıldığında farklı davranışlar gösterdiği bir gerçektir shve bu, çoğunlukla kabuğun diğer özelliklerini değil, kabuğunu kaldırır.


16

Bildiğim kadarıyla, orijinal Bourne kabuğu, lisansı nedeniyle BSD'ler ve GNU projesi tarafından kullanılamadı.

O zamanlar orijinal Unix'in lisansı yoktu ve GNU projesinin GPL'nin altında bir kabuğa ihtiyacı vardı, böylece bash kullandılar.

Aynı şey, tüm BSD'lerin ebeveyni BSD4 için de geçerlidir. AT&T davası sayesinde, tüm kaynakları Bourne kabuğu da dahil olmak üzere orijinal Unix'ten yeniden yazmak zorunda kaldılar.

Geleneksel BSD hattında, Bourne kabuğu 4.3BSD-Reno'ya (ancak Net / 2 ve sonraki 4.4BSD'ler ile birlikte değil) kadar sevk edildi. Lisans nedeniyle daha sonra Kenneth Almquist (genellikle kül olarak adlandırılır) tarafından bourne uyumlu, svr4 benzeri sh ile değiştirildi.

FreeBSD'lerden man sh

Bir sh komutu, Thompson kabuğu, Versiyon 1 AT&T UNIX'te ortaya çıktı. Sh adını alan Bourne kabuğu tarafından Versiyon 7 AT&T UNIX’te yerini aldı.

Sh'ın bu sürümü 1989 yılında AT&T System V Release 4 UNIX'ten Bourne kabuğundan sonra BSD lisansı altında yeniden yazıldı.

Bu yüzden her iki proje de Bourne kabuğunu kullanmama ve gerçek bir açık kaynak kodlu kabuk yerleştirmeye zorlandı.


7

Başka problemler de oldu. Bourne Kabuğu, malloc () yerine sbrk () kullandı ve bu da onu taşınabilir hale getirmedi.

Bourne Shell'in OpenSolaris aracılığıyla OpenSource haline gelmesinden sonra, bir taşınabilir taşınabilir versiyon ve daha sonra da sbrk () 'ı malloc () ile Geoff Collyer'ın (aynı zamanda bir kişide sbrk ()) kullanılmamasına yardımcı olan malloc () ile değiştirerek gerçekten taşınabilir bir versiyon oluşturdum. Korn Shell).

Bourne Shell'in taşınabilir bir versiyonunu yapmamın ilk nedeni, 1982 ve 1984 yılları arasında Bourne Shell'de de bulunan "bsh" için yazdığım Tarih Düzenleyicisini yapmaktan hoşlanıyor olmamdı. Bu arada, "bsh" için yazdığım benzersiz özelliklerin çoğunu Bourne Kabuğuna taşıdım.

Bu diğerleri arasında:

  • Cygwin dahil hemen hemen her yerde derler ve çalışır (bashtan neredeyse 2 kat daha hızlı)
  • LRU halka tamponlu geçmiş editörü
  • yerleşik TERMCAP
  • Gelişmiş takma adlar (global kalıcı takma adlar, yerel takma adlar, ....) ve "dosh" yerleşimi ile birlikte, Bourne Kabuğu, parametrelendirilebilir takma adları sağlayan tek Bourne Kabuğu uygulamasıdır.
  • Ham düzende tarih düzenleyicideki karmaşık takma adları düzenleme desteği.
  • Exit (2) kodunun 32 bitinin tümüne .sh. * Değişkenleriyle erişin.
  • 6 haneli çözünürlükte gelişmiş otomatik zamanlama
  • Pushd / Popd / dirs
  • yerleşik "bul"
  • Stderr'den gelen borular
  • Daha iyi performans için vfork () kullanımı.
  • Sonunda, tüm belgelenmiş böcekleri SVr4 Bourne Kabuğu'ndan düzeltti, örneğin askıya alma her zaman iş kontrol modunda çalışır. ...

Online man sayfası şuradadır : http://schillix.sourceforge.net/man/man1/bosh.1.html Kaynaklar şurada bulunan schily araç kutusunun bir parçasıdır:

https://sourceforge.net/projects/schilytools/files/

Tavsiye ederim: http://sourceforge.net/projects/schilytools/files/schily-2015-08-18.tar.bz2 veya daha yeni bir sürüm.

PS Geribildirimle ilgileniyorum


Selam Joerg. Neden onları bazı BSD sh veya pdksh gibi POSIXified olan bir kabuk yerine Bourne kabuğuna taşıyorsunuz?
Stéphane Chazelas

Bourne Shell taşımaları, stdio kullanmadığı için zor bir işti. Bu, orijinal csh kaynağını almak ve VAX assembler'da yazılan stdio olmayan printf'i değiştirerek derlemek için benzer bir zorluktu. Ancak zaten Bourne Kabuğuna birçok yeni POSIX özelliği ekledim ve Killi Kabuğu ile mümkün olmayan ayrı dosya sistemlerinde / anr / usr ile önyüklemesini sağlamak için SchilliX'deki Bourne Kabuğu'nda kalmayı seviyorum.
schily

Ayrıca, ksh hızının vfork () işlevinden kaynaklandığını doğrulamak istediğime dikkat edin. Artık Bourne Kabuğunu vfork () kullanacak şekilde dönüştürdüğümde, en yeni ksh sürümleri kadar hızlı. Bu, yalnızca orijinal Bourne Shell kaynak koduyla başladığınızda edindiğiniz bir deneyimdir.
schily

Tamam, ama bu POSIX'i uyumlu hale getirene kadar, çok fazla ilgi çekmesi pek olası değil. Austin grubu ML’de Bourne kabuğunun POSIX’iyle uyumsuzluklar hakkında sorduğunuzu hatırlıyorum, üzerinde çalıştığınız bir şey mi (Bourne kabuğuyla geriye dönük uyumluluk kırılması anlamına gelir)? Ayrıca insanlar (en azından ben) POSIX sh sözdizimini Bourne kabuğu üzerinde bir ilerleme olarak görüyorlar. Bourne'dan türetilmiş kabuğunuzu aramaya devam ederek, Bourne kabuğu yanlış izlenim gönderebilir. Nasıl bimsh (Bourne gelişmiş (ala vi / vim))?
Stéphane Chazelas

Bourne Shell'im zaten bazı yönlerden ksh'den daha iyi; örneğin, eğer hala eğer SVR2 tabanlı olan ksh kullanıyorsa, modern UNIX özelliklerine dayanan daha iyi takma adlar, push / popd / dirs ve kaynak kullanımı desteği uygulamak. Eğer kabuk ilgilenen ve yetenekli gibi görünüyor, ben okuduktan sonra Bourne Shell sonraki görmek istiyorum ilgili fikir edinmek istiyorum: schillix.sourceforge.net/man/man1/bosh.1.html Not o Şimdiye kadar tüm yeni kodlara sahibim # ifdef'd ve bazı özelliklerin (stderr boruları gibi) set (1) üzerinden açılması gerekiyor.
schily

4

% 100 Geriye dönük uyumluluk sağlayan kabukları ile bağlantılıdır . Orijinal kabuğun sahip olduğu hiçbir şeyi kaybetmezsiniz, ama üzerine daha fazla özellik kazandırırsınız. Dezavantajı yok bu yüzden neden yeni özellikleri kaçırmıyorsunuz? Bu, /bin/vigenellikle genellikle vim ile bağlantılı olmasının sebebidir .


5
Dezavantajı, insanların kendi sistemlerinde çalışan senaryolar yazmasıdır, senaryoların uyumlu olmadıklarında uyumlu olduğunu düşünürler. Bir keresinde, bash gerektiren ancak / bin / sh olarak adlandırılan neredeyse yüz Gentoo kabuk komut dosyasını düzelttim. Hepsi bash yerine tire / bin / sh değiştirdiğimde kırıldı.
Zan Lynx

3
"olumsuz taraf yok" - hız. örneğin bash, çok, çok daha yavaşdash
strugee

@ strugee Bir kabuktaki ms-aralığı iyileştirme hızını arıyorsanız, muhtemelen iş için doğru aleti kullanmıyorsunuzdur.
Chris Down,

1
@ChrisDown "ms-range geliştirmeleri" ni tanımlıyor mu?
strugee

2
POSIX sh sözdizimi, Bourne sh sözdizimi ile geriye dönük olarak tam uyumlu değildir. Örneğin IFS=,; rm file1,file2,file3, Bourne kabuğundaki bu 3 dosyayı kaldırır. Bu (saçma) özelliği POSIX sh'de kaldırıldı. Bourne kabuğuna yazılan bir komut dosyasının bir POSIX sh ile farklı şekilde çalışmasına neden olabilecek düzinelerce farklılıklar vardır.
Stéphane Chazelas 28:15
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.