Bash ve sh arasındaki fark nedir?


28

İki tür kodun kullanıldığını görüyorum:

#!/usr/bin/sh

ve:

#!/user/bin/bash

Bu çevrimiçi aradım ve görüşler çok değişir. Çoğu web sitesinde gördüğüm açıklamalar bunun shdaha eski olduğunu bashve gerçek bir fark olmadığını söylüyor .

Birisi bunlar arasındaki farkı biliyor mu? Birini diğerinden ne zaman kullanacağım konusunda pratik bir örnek verebilir misiniz?


farklı mermilerle ilgili genel bir bakış için (sadece shve değil bash): http://en.wikipedia.org/wiki/Comparison_of_command_shells
akira 30:10

1
Burada bir diğer büyük geçmişi: faqs.org/faqs/unix-faq/shell/shell-differences
John Wright

Yanıtlar:


34

bashshyani bir süper kümesidir . İçinde yapabildiğin her şey içinde shyapabilirsin bash.

Bash'in senaryo yazmayı kolaylaştıran daha fazla özelliği (dallanma, yerleşikler, diziler) vardır. Bazıları sonra * nix'lerin /bin/shbağlantısı var./bin/bash

Burada bir öğreticinin tam bir açıklaması için


5
@ Saif Bechan: Bourne kabuğunun ( sh) sadece uzatılmamasının bir nedeni Bash'in başkası tarafından yazılmış olmasıdır. Ayrıca bahse girerim lisans sorunları vardı. Bourne Kabuğu ile ilgili makaleyi okuyun en.wikipedia.org/wiki/Bourne_shell
Felix

7
Kaldırılması sh, orada olmasını bekleyen ve bir şeyleri ayrıştırma yöntemine dayanan birçok komut dosyasını kırar. Linux kullanıcıları umursamayabilir, ancak Solaris, AIX veya HP-UX'a $$ bin dolar harcayan insanlar çok rahatsız olabilir.
njd

3
... ve daha da fazla eğlence için, Ubuntu kısa çizgi çizer / bin / sh. Dash tamamen sh veya bash uyumlu değil, ancak daha hızlı başlaması gerekiyor. Sistem önyüklenirken, tüm init.d scriptleri çalışır ve genel olarak kaydedilen sürenin buna değer olduğunu sanırım.
kbyrd

8
Dash'in tamamen uyumlu olduğundan eminim. Sorun, bazı insanların / bin / sh diyen komut dosyaları yazmasıdır, ancak komut dosyasının çalışması için / bin / bash gereklidir. Hiç kimse bir sorun fark etmiyor, çünkü çoğu zaman, / bin / sh, / bin / bash değerini gösterir.
davr

8
@ Saif: shBasitçe genişletilmemesinin başka bir nedeni daha var: Kaynak kodu tamamen cehennem. Bir göz at. Oluyor sözde C ... olmak
grawity

6

Geleneksel olarak, / bin / sh, geçmişi veya komut satırı düzenlemesi olmayan ve iş kontrolü olmayan orijinal Bourne kabuğu olacaktır.

Yaklaşık 15 yıldan beri, çoğu Unix, POSIX kabuğunu kurdu ya da en azından ksh ya da bash (neredeyse POSIX benzeri) kurdu, ancak hala / bin / sh içinde daha sınırlı bir kabuğa sahipti.

Bunun nedeni, eski shkomutu bekleyen eski kabuk komut dosyalarının hala çalışacak olmasıdır.
Karakterler gibi bu yana {, }ve !bash özel bir anlamı var, (onları kaçan olmadan) bu karakterleri kullanarak eski kabuk komut dosyası başarısız olması mümkündür.
(Bourne kabuğu !!{1,2}kelimenin tam anlamıyla alacaktır , oysa bash bunu önceki komutun tekrarı olarak yorumlayacaktır ( !!) ardından bir ayraç genişletme).

Yine de Linux'ta shkomut, bashaynı özelliklere sahip hemen hemen her zaman sadece bir bağlantıdır .


2
Bash'in / bin / sh olarak çağrılırsa sh uyumluluk modunda davranması gerekir (ancak her zaman olmaz). Ubuntu / bin / sh komutunu / bin / bash dizinine / bin / dash dizinine değiştirdiğinde çok şey kırıldı. Kırılan şeyler standart sh kullanmaları gerektiğinde temelleri varsaydılar.
Broam

4

sh, Bourne kabuğu veya / bin / sh anlamına gelebilir, bu da çoğu modern platformda başka (POSIX uyumlu) bir kabuktur. "POSIX kabuğu", POSIX modunda bash tarafından uygulanan POSIX tarafından tanımlanan soyut kabuk veya varsayılan olarak ksh veya kısa çizgidir. / bin / sh bazen POSIX kabuğu olarak da bilinir, çünkü çoğu platformda POSIX'e uygun bir kabuktur. Orijinal Bourne kabukları POSIX kabukları değildir.

bashref, bash ve Bourne kabukları arasındaki farkların bir listesine sahiptir . bash POSIX modunda çağrıldığında değişikliklerinman bash bir listesi vardır .

/ bin / sh, OS X'te bir sembolik bağlantı veya sabit bağlantı değildir, ancak neredeyse / bin / bash ile aynı boyuttadır:

$ ls -li /bin/{ba,}sh
29631757 -r-xr-xr-x  1 root  wheel  1333920 Jul 26 01:52 /bin/bash
29631758 -r-xr-xr-x  1 root  wheel  1334000 Jul 26 01:52 /bin/sh

erkek bash :

Sh adıyla bash çağrılırsa, sh'ın tarihsel sürümlerinin başlangıç ​​davranışını mümkün olduğunca yakından taklit etmeye çalışır ve POSIX standardına da uyar.

Bourne mermilerini taklit etmek bayağı sınırlı. bash +B(Bourne), küme ayracı genişlemesi gibi özellikleri aslında devre dışı bırakır.

$ sh
$ echo {a,b}
a b
$ echo $BASH_VERSION
3.2.48(1)-release
$ bash +B
$ echo {a,b}
{a,b}

Ancak POSIX modunu devre dışı bıraksanız bile, yankı echo -evarsayılan olarak şöyle davranır :

$ sh
$ shopt -uo posix
$ echo '1\b2'
2

/ bin / sh, Ubuntu'da tiredir , bu nedenle bazı temel bilgiler OS X'te / bin / sh ile çalışır ancak Ubuntu'da çalışmaz.

Eğer orijinal Bourne mermileri için aslında senaryo yazmak istiyorsan #!/usr/bin/env bash +Bbunun yerine kullanabilirsin .

POSIX özelliklerinin veya Bourne mermilerinin bir parçası olmayan özelliklerden kaçınmaktan veya diğer mermilerle her şeyi test etmekten daha bash için komut dosyaları yazmak daha kolay.


2

Aslında, / bin / sh, / bin / bash ile bağlantı kursa da, farklı davranışlar gösterir. Bash manpage'den:

Sh adıyla bash çağrılırsa, sh'ın tarihsel sürümlerinin başlangıç ​​davranışını mümkün olduğunca yakından taklit etmeye çalışır ve POSIX standardına da uyar.

Böylece sh, tarihi sh davranışını taklit etmeye çalışır. Olarak bash, etkileşimli bir giriş kabuğu kadar olabildiğince faydalı olmaya çalışır.


2

Birçok sistemde ve özellikle Solaris'te, sh statik olarak bağlanırken bash dinamik olarak bağlanır. Bu bir güvenlik tehdidi oluşturabilir, bu nedenle root kullanıcısı sadece / bin / sh komutunu kabuk olarak kullanmalıdır (hiç root olarak giriş yapmanız gerekiyorsa).


2
Ayrıca, kötü bir şey yaptıysanız ldconfigveya /librehberiniz bir nedenden dolayı silinirse, acil durumlarda faydalı olabilir .
LawrenceC
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.