Sh ve bash arasındaki fark


1303

Kabuk programları yazarken genellikle /bin/shve kullanırız /bin/bash. Genellikle kullanıyorum bashama aralarındaki farkın ne olduğunu bilmiyorum.

Arasındaki temel fark nedir bashve sh?

İçinde programlarken farkında olması için ne gerekir bashve sh?


21
Bourne kabuğunda çalışan bashisms ve karşılık gelen kodun yararlı bir listesi için bkz. Mywiki.wooledge.org/Bashism
StackExchange saddens dancek

1
Sh ve komut dili için POSIX standardını görmek isteyebilirsiniz : * sh * Shell Komut Dili
Maurício C Antunes

7
genel bir kural olarak, tüm sh betikleri posix uyumluluğu sayesinde bash altında çalışacaktır, ancak tüm bash betikleri sh altında çalışamaz, fark ettiğiniz temel farklar, alıntı yapılmayan alanlara izin veren karşılaştırmalar yerine [[]] gibi şeylerdir, $ [()) yerine $ [] aritmetik ifadeler ve doğrudan bash dokümanlarından "çok büyük ve çok yavaş" gibi diğer şeyler. Geriye dönük uyumluluk, bu günlerde çoğu zaman böyle değil, sonuçta 2014 yılı doğru (ya da ...) oldu ??
osirisgothra

Yanıtlar:


1140

Sh nedir

sh(veya Kabuk Komut Dili) POSIX standardında tanımlanan bir programlama dilidir . Birçok uygulamaları vardır ( ksh88, dash, ...). bashayrıca bir uygulama olarak düşünülebilir sh(aşağıya bakınız).

Çünkü shbir uygulama değil, bir belirtim, /bin/shçoğu POSIX sisteminde gerçek bir uygulamaya yönelik bir sembolik bağlantıdır (veya sabit bir bağlantıdır).

Bash nedir

bashshuyumlu bir uygulama olarak başladı (POSIX standardını birkaç yıl geçmesine rağmen), ancak zaman geçtikçe birçok uzantı elde etti. Bu uzantıların çoğu geçerli POSIX kabuğu komut dosyalarının davranışını değiştirebilir, bu nedenle tek başına bashgeçerli bir POSIX kabuğu değildir. Aksine, POSIX kabuk dilinin bir lehçesidir.

bash--posixPOSIX uyumlu hale getiren bir anahtarı destekler . Ayrıca çağrılırsa POSIX'i taklit etmeye çalışır sh.

sh = bash?

Uzun süredir, çoğu GNU / Linux sistemine /bin/shişaret /bin/bashediyordu. Sonuç olarak, ikisi arasındaki farkı görmezden gelmek neredeyse güvenli hale gelmişti. Ancak bu son zamanlarda değişmeye başladı.

İşaret /bin/shetmeyen bazı sistem örnekleri /bin/bash(ve /bin/bashhatta bazıları mevcut olmayabilir):

  1. Varsayılan olarak symlink shyapan modern Debian ve Ubuntu sistemleri dash;
  2. Busybox , genellikle Linux sistem açılışında bir parçası olarak çalıştırılır initramfs. ashKabuk uygulamasını kullanır .
  3. BSD'ler ve genel olarak Linux dışındaki tüm sistemler. OpenBSD pdksh, Korn kabuğunun soyundan geliyor. FreeBSD'ler shorijinal UNIX Bourne kabuğunun torunudur. Solaris'in shuzun bir süre POSIX uyumlu olmayan bir özelliği vardır; Heirloom projesinden ücretsiz bir uygulama elde edilebilir .

/bin/shSisteminizde nelere dikkat edeceğinizi nasıl öğrenebilirsiniz ?

Komplikasyon, /bin/shsembolik bir bağlantı veya sert bir bağlantı olabilir. Sembolik bir bağlantıysa, bunu çözmek için taşınabilir bir yol:

% file -h /bin/sh
/bin/sh: symbolic link to bash

Zor bir bağlantıysa deneyin

% find -L /bin -samefile /bin/sh
/bin/sh
/bin/bash

Aslında, -Lbayrak sembolik ve sabit bağları hem kapsar, ancak bu yöntemin dezavantajı taşınabilir olmadığıdır - POSIX gerektirmez find desteklemek için -samefilehem de, seçenek GNU bulmak ve FreeBSD bulmak destekleyeceğini bunu.

Mesele hattı

Sonuçta, senaryonun ilk satırı olarak «shebang» satırını yazarak hangisini kullanacağınıza karar vermek size kalmış.

Örneğin

#!/bin/sh

kullanacak sh(ve işaret etmek için ne olursa olsun),

#!/bin/bash

kullanacaktır /bin/bashSunulursa, (ve eğer o değil bir hata iletisiyle başarısız). Elbette başka bir uygulama da belirtebilirsiniz, ör.

#!/bin/dash

Hangisini Kullanmalı

Kendi senaryolarım shiçin aşağıdaki nedenlerden dolayı tercih ederim :

  • standartlaştırılmıştır
  • öğrenmesi çok daha basit ve kolaydır
  • POSIX sistemlerinde taşınabilir - sahip olmasalar bile, sahip basholmaları gerekirsh

Kullanmanın da avantajları vardır bash. Özellikleri, programlamayı daha modern ve diğer modern programlama dillerinde programlamaya benzer hale getirir. Bunlar, kapsam dahilindeki yerel değişkenler ve diziler gibi şeyleri içerir. Plain shçok minimalist bir programlama dilidir.


Eğer bashsentaks hata durumunda görüntüleme yolu daha yararlı hata mesajları ile bir komut dosyası çalıştırırsanız . Sadece bash kullanarak zaman kazanabilirsiniz.
PHPst

%Komut satırlarınızın başında ne anlama geliyor?
JosephHarriott

@JosephHarriott bu bir komut istemi: komutun ardından gelen kabuğun kendisi tarafından basılan bir karakter. Bazı kabuklar kök kabuk $yerine %veya #kök kabuk için kullanılır.
Roman Cheplyaka

@RomanCheplyaka hangi kabukları? Ben sadece şimdiye kadar gördüm $ve #...
JosephHarriott

@RomanCheplyaka Ben shbash çok önce var eminim (bu tekrar bourne kabuğu anlamına gelir). Ama çok ilkeldi ve ESCkarakterler gibi terminal olaylarına cevap vermedi . Sonra kshgeldi (ayrıca bash'tan önce), sonra bash daha iyi bir kabuk fikrini sevenlerle başladı, ama ksh'tan nefret ediyordu. :-)
raminr

145

sh: http://man.cx/sh
bash : http://man.cx/bash

TL; DR : daha zarif bir sözdizimi ve daha fazla işlevsellik içeren bir bashüst kümedir sh. Modern platformlarda oldukça yaygın olduğu için hemen hemen her durumda bir bash shebang hattı kullanmak güvenlidir.

Not: bazı ortamlarda, sh bir bash . Kontrol edin sh --version.


31
bash sh olarak çağrılırsa, biraz farklı davranır. Bkz. Gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files ("sh adıyla çağrılır") ve gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Örneğin, işlem ikamesi yoktur.
glenn jackman

11
Bash, sh'in bir üst kümesi olduğundan ve FreeBSD gibi bazı işletim sistemlerinde varsayılan olarak bash yüklü olmadığından, sh'de komut dosyası oluşturmak daha fazla taşınabilirlik sağlar.
user674062

1
Belirli bir komut dosyası için POSIX kabuğu almanın taşınabilir yazılabilir bir yolu olmadığından, taşınabilir komut dosyaları Bourne Shell özelliklerinden daha fazlasını kabul edemez.
schily

83

Bu soru sıklıkla kullanmaya çalışan insanlar için kanonik olarak aday gösterildi shve aynı şekilde davranmadığına şaşırdı bash. İşte yaygın yanlış anlamalar ve tuzaklar hakkında kısa bir bilgi.

Öncelikle, ne bekleyeceğinizi anlamalısınız.

  • Eğer betiğinize çalıştırırsanız sh scriptnameveya birlikte çalıştırmak scriptnameve sahip #!/bin/shde shebang hattı, POSIX beklemesin shdavranış.
  • Eğer betiğinize çalıştırırsanız bash scriptnameveya birlikte çalıştırmak scriptnameve sahip #!/bin/bashshebang hattında (veya yerel eşdeğeri), sen Bash davranışını beklemek gerekir.

Doğru bir sapmaya sahip olmak ve sadece komut dosyası adını yazarak komut dosyasını çalıştırmak (muhtemelen göreceli veya tam yolla ) genellikle tercih edilen çözümdür. Doğru bir shebang ek olarak, bu komut dosyasının yürütme izni ( chmod a+x scriptname) olması gerekir.

Peki, aslında nasıl farklılar?

Bash Referans el kitabında, farklılıkları numaralandırmaya çalışan bir bölüm vardır, ancak bazı yaygın karışıklık kaynakları şunları içerir:

  • [[mevcut değildir sh(sadece [bu daha aksak ve sınırlı).
  • sh dizileri yok.
  • Bazı Bash anahtar kelimeler gibi local, source, function, shopt, let, declare, ve selecttaşınabilir değildir sh. (Bazı shuygulamalar, ör local.
  • Bash, üç bağımsız değişken for((i=0;i<=3;i++))döngüsü, +=artış ataması vb.Gibi birçok C tarzı sözdizimi uzantısına sahiptir . Bu $'string\nwith\tC\aescapes'özellik POSIX için geçici olarak kabul edilir (şu anda Bash'te çalıştığı anlamına gelir, ancak henüz shyalnızca akıma bağlı olan sistemlerde desteklenmeyecektir. POSIX spesifikasyonu ve muhtemelen bir süre gelmeyecek).
  • Bash destekler <<<'here strings'.
  • Bash genişlemesi var *.{png,jpg}ve {0..12}destekliyor.
  • ~ifade eder $HOME(daha genel olarak ve sadece Bash ~usernameana dizinine username).Bu POSIX'te, ancak bazı POSIX öncesi /bin/shuygulamalarda eksik olabilir .
  • Bash <(cmd)ve ile işlem yerine geçer >(cmd).
  • Bash gibi CSH tarzı kolaylık yönlendirme takma adları vardır &|için 2>&1 |ve &>için> ... 2>&1
  • Bash, <>yeniden yönlendirmeli yardımcı süreçleri destekler .
  • Bash gibi genişletilmiş standart dışı parametre genişletme zengin bir dizi özellik ${substring:1:2}, ${variable/pattern/replacement}vb, vaka dönüşüm,
  • Bash, kabuk aritmetiği için önemli ölçüde genişletilmiş tesislere sahiptir (yine de kayan nokta desteği yoktur). $[expression]Ancak eski bir sözdizimi sözdizimi vardır, ancak POSIX aritmetik $((expression))sözdizimi ile değiştirilmelidir . (Bazı eski POSIX öncesi shuygulamaları bunu desteklemeyebilir.)
  • Sihirli değişkenler gibi $RANDOM, $SECONDS, $PIPESTATUS[@]ve $FUNCNAMEBash uzantılarıdır.
  • Gibi Sözdizimsel farklar export variable=valueve [ "x" == "y" ](taşınabilir olmayan export variabledeğişken atama ve taşınabilir dize karşılaştırma ayrı olmalı [ ... ]tek eşittir işareti kullanımlar).
  • İsteğe bağlı davranışı etkinleştirmek veya devre dışı bırakmak ve kabuğun iç durumunu göstermek için birçok, yalnızca Bash eklentisi.
  • Bununla birlikte, komut dosyası davranışını etkilemeyen etkileşimli kullanım için birçok kolaylık özelliği.

Unutmayın, bu kısaltılmış bir listedir. Tam kepçe için referans kılavuzuna ve birçok iyi geçici çözüm için http://mywiki.wooledge.org/Bashism'e bakın; ve / veya yalnızca Bash özelliklerinin çoğunu uyaran http://shellcheck.net/ adresini deneyin .

Yaygın bir hata, bir #!/bin/bashshebang satırına sahip olmaktır , ancak daha sonra sh scriptnamekomut dosyasını çalıştırmak için kullanılır . Bu temelde yalnızca Bash işlevlerini devre dışı bırakır, bu nedenle örneğin dizileri kullanmaya çalışmak için sözdizimi hataları alırsınız. (Mesele çizgisi sözdizimsel olarak bir yorumdur, bu yüzden bu senaryoda basitçe göz ardı edilir.)

Ne yazık ki, Bash, bu yapıları çağrıldığında kullanmaya çalıştığınızda uyarmaz sh. Tüm Bash işlevlerini de tamamen devre dışı bırakmaz , bu nedenle Bash'i çalıştırarak çalıştırmak sh, komut dosyanızın ash/ dash/ POSIX'e shveya Heirloom gibi varyantlara uygun şekilde taşınabilir olup olmadığını kontrol etmek için iyi bir yol değildir.sh


2
Temel olarak, TL; DR ersiyonu And'ın cevabıdır .
Üçlü

4
shellcheck.net ihtiyacım olan tek şeydi. çok teşekkürler.
Josh Habdas

FWIW, export variable=valuePOSIX tarafından zorunlu kılınmıştır: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Belki de bazı eski kabuklarda mevcut değildir, ancak kesinlikle bir bashizm değildir.
Roman Cheplyaka

53

Kabuk , bir işletim sisteminin hizmetlerine erişmek için kullanıcı ve işletim sistemi arasındaki bir arabirimdir. GUI veya CLI (Komut Satırı arayüzü) olabilir.

sh (Bourne sh ell), Unix / Unix benzeri işletim sistemleri için bir kabuk komut satırı yorumlayıcısıdır. Bazı yerleşik komutlar sağlar. Senaryo yazımında tercüman olarak belirtiyoruz #!/bin/sh. En yaygın olarak bash (serbest / açık), kash (serbest değil) gibi diğer kabuklar tarafından destekleniyordu.

Bash ( B ourne bir gain'in s cehenneme) Bourne kabuğu için bir kabuk değiştirme. Bash sh'ın süper setidir. Bash sh'yi destekler. POSIX, POSIX uyumlu sistemlerin nasıl çalışması gerektiğini tanımlayan bir dizi standarttır. Bash aslında POSIX uyumlu bir kabuk değildir. Bir betik dilinde yorumlayıcı olarak belirtiyoruz #!/bin/bash.

Analoji:

  • Kabuk bir arayüz veya özellikler veya API gibidir.
  • sh, Shell arabirimini uygulayan bir sınıftır.
  • Bash, sh'nin bir alt sınıfıdır.

resim açıklamasını buraya girin


3
Anlamıyorum. Hem "Bash, sh'in üst kümesidir" hem de "Bash, sh'in bir alt sınıfıdır" demiştiniz, aksine ifadeler değil mi? Lütfen açıklar mısın?
Keerthana Prabhakaran

11
Bu Bash miras söylemeye çalışıyorum düşünüyorum sh(yani OOP anlamda bir "alt sınıf") ve genişletir (böylece işlevselliğin bir üst kümesi vardır).
Üçlü

52

UNIX.COM sitesinden yayın

Kabuk özellikleri

Aşağıdaki tablo, bir kabuğu diğerine tercih etmenizi sağlayacağını düşündüğüm çoğu özelliği listelemektedir. Kesin bir liste olması amaçlanmamıştır ve olası her kabuk için olası her özelliği içermez. Bir özelliğin yalnızca işletim sistemiyle birlikte gelen sürümde veya doğrudan standart dağıtımdan derlenmiş olarak kullanılabilmesi durumunda bir kabukta olduğu düşünülür. Özellikle aşağıda belirtilen C kabuğu SUNOS 4'te mevcuttur. * Önemli sayıda satıcı şimdi tcsh veya kendi gelişmiş C kabuğunu gönderiyor (her zaman tcsh gönderdiklerini açıkça belirtmiyorlar).

Kod:

                                     sh   csh  ksh  bash tcsh zsh  rc   es
Job control                          N    Y    Y    Y    Y    Y    N    N
Aliases                              N    Y    Y    Y    Y    Y    N    N
Shell functions                      Y(1) N    Y    Y    N    Y    Y    Y
"Sensible" Input/Output redirection  Y    N    Y    Y    N    Y    Y    Y
Directory stack                      N    Y    Y    Y    Y    Y    F    F
Command history                      N    Y    Y    Y    Y    Y    L    L
Command line editing                 N    N    Y    Y    Y    Y    L    L
Vi Command line editing              N    N    Y    Y    Y(3) Y    L    L
Emacs Command line editing           N    N    Y    Y    Y    Y    L    L
Rebindable Command line editing      N    N    N    Y    Y    Y    L    L
User name look up                    N    Y    Y    Y    Y    Y    L    L
Login/Logout watching                N    N    N    N    Y    Y    F    F
Filename completion                  N    Y(1) Y    Y    Y    Y    L    L
Username completion                  N    Y(2) Y    Y    Y    Y    L    L
Hostname completion                  N    Y(2) Y    Y    Y    Y    L    L
History completion                   N    N    N    Y    Y    Y    L    L
Fully programmable Completion        N    N    N    N    Y    Y    N    N
Mh Mailbox completion                N    N    N    N(4) N(6) N(6) N    N
Co Processes                         N    N    Y    N    N    Y    N    N
Builtin artithmetic evaluation       N    Y    Y    Y    Y    Y    N    N
Can follow symbolic links invisibly  N    N    Y    Y    Y    Y    N    N
Periodic command execution           N    N    N    N    Y    Y    N    N
Custom Prompt (easily)               N    N    Y    Y    Y    Y    Y    Y
Sun Keyboard Hack                    N    N    N    N    N    Y    N    N
Spelling Correction                  N    N    N    N    Y    Y    N    N
Process Substitution                 N    N    N    Y(2) N    Y    Y    Y
Underlying Syntax                    sh   csh  sh   sh   csh  sh   rc   rc
Freely Available                     N    N    N(5) Y    Y    Y    Y    Y
Checks Mailbox                       N    Y    Y    Y    Y    Y    F    F
Tty Sanity Checking                  N    N    N    N    Y    Y    N    N
Can cope with large argument lists   Y    N    Y    Y    Y    Y    Y    Y
Has non-interactive startup file     N    Y    Y(7) Y(7) Y    Y    N    N
Has non-login startup file           N    Y    Y(7) Y    Y    Y    N    N
Can avoid user startup files         N    Y    N    Y    N    Y    Y    Y
Can specify startup file             N    N    Y    Y    N    N    N    N
Low level command redefinition       N    N    N    N    N    N    N    Y
Has anonymous functions              N    N    N    N    N    N    Y    Y
List Variables                       N    Y    Y    N    Y    Y    Y    Y
Full signal trap handling            Y    N    Y    Y    N    Y    Y    Y
File no clobber ability              N    Y    Y    Y    Y    Y    N    F
Local variables                      N    N    Y    Y    N    Y    Y    Y
Lexically scoped variables           N    N    N    N    N    N    N    Y
Exceptions                           N    N    N    N    N    N    N    Y

Yukarıdaki tablonun anahtarı.

Y Özelliği bu kabuk kullanılarak yapılabilir.

N Kabukta özellik yok.

F Özellik yalnızca mermi işlev mekanizması kullanılarak yapılabilir.

L Bu özelliği etkinleştirmek için readline kitaplığının kabuğa bağlanması gerekir.

Yukarıdaki tabloya ilişkin notlar

1. This feature was not in the original version, but has since become
   almost standard.
2. This feature is fairly new and so is often not found on many
   versions of the shell, it is gradually making its way into
   standard distribution.
3. The Vi emulation of this shell is thought by many to be
   incomplete.
4. This feature is not standard but unofficial patches exist to
   perform this.
5. A version called 'pdksh' is freely available, but does not have
   the full functionality of the AT&T version.
6. This can be done via the shells programmable completion mechanism.
7. Only by specifying a file via the ENV environment variable.

Bourne Shell'in özelliklerini ve 1988'den önceki ksh'dan özellikleri karşılaştırmaya çalıştığından masanız benim için yararlı değildir. 1988 için gerçekten bir masa yaparsanız, o tablodaki diğer kabukların çoğunu kaldırmanız gerekir - bash dahil , sh ve rc. Tablonuz için değerleri nereden aldığınız açıklayabilir misiniz?
schily

1
Bazı ipuçları vereyim: 1989'da Bourne Kabuğuna İş Kontrolü eklenmiş ve 2005'te Bourne Kabuğu Açık Kaynak haline getirilmiştir. Korn kabuğunun en az 1988'den beri süreç ikamesi vardır ve 1997'den beri OpenSource'tur. BTW: $ ENV ile ilgili açıklamalarınız doğru değilse, $ ENV yalnızca etkileşimli kabuklar için okunur / yürütülür.
schily


@ schily Herhangi bir yerde yanlış olduğunu düşünüyorsanız, lütfen uygun şekilde düzenlemekten çekinmeyin.
SriniV

8
Şiddetle maruz kalanlara dayanarak, esasen hileli olduğu için OP'nin bu cevabı kaldırmanın daha iyi olacağı ve OP'nin yapıştırdığı bilgileri gerçekten incelemediği anlaşılıyor.
danno

24

TERMİNAL

  • pencere açan program (lar)
  • xterm, rxvt, konsole, kvt, gnome terminali, nxterm ve eterm.

KABUK

  • Terminalde çalışan bir programdır
  • Shell hem komut yorumlayıcısı hem de programlama dilidir
  • Kabuk sadece komutları çalıştıran bir makro işlemcidir.
  • Makro işlemci, daha büyük ifadeler oluşturmak için metin ve sembollerin genişletildiği işlevsellik anlamına gelir.

SH Vs. BASH

SH

  • (Kabuk)
  • Belirli bir kabuk
  • bir komut yorumlayıcısı ve bir programlama dili
  • BASH'in öncülü

BASH

  • (Bourne-Yine Kabuğu)
  • Belirli bir kabuk
  • bir komut yorumlayıcısı ve bir programlama dili
  • Sh işlevselliğine ve daha fazlasına sahiptir
  • SH halefi
  • BASH varsayılan SHELL'dir

REFERANS MALZEMESİ:

SHELL gnu.org:

Temelinde, kabuk komutları yürüten bir makro işlemcidir . Terim , metin ve semboller genişletilir makro işlemci aracı işlevi daha büyük ifadeler oluşturun.

Unix kabuğu hem komut yorumlayıcısı hem de programlama dilidir. Komut yorumlayıcısı olarak kabuk, zengin GNU yardımcı programlarına kullanıcı arabirimi sağlar. Programlama dili özellikleri bu yardımcı programların birleştirilmesine izin verir. Komut içeren dosyalar oluşturulabilir ve komut haline getirilebilir. Bu yeni komutlar, / bin gibi dizinlerdeki sistem komutlarıyla aynı duruma sahiptir ve kullanıcıların veya grupların ortak görevlerini otomatikleştirmek için özel ortamlar oluşturmalarına olanak tanır.

Kabuklar etkileşimli veya etkileşimli olmayan şekilde kullanılabilir. Etkileşimli modda, klavyeden yazılan girişi kabul ederler. Etkileşimli olmayan bir şekilde yürütülürken, kabuklar bir dosyadan okunan komutları yürütür.

Kabuk, GNU komutlarının hem eşzamanlı hem de eşzamansız olarak yürütülmesine izin verir. Kabuk, daha fazla girdi kabul etmeden önce eşzamanlı komutların tamamlanmasını bekler; eşzamansız komutlar, ek komutları okuyup yürütürken kabuğa paralel olarak yürütülmeye devam eder. Yeniden yönlendirme yapıları, bu komutların giriş ve çıkışlarının ayrıntılı denetimine izin verir. Ayrıca, kabuk, komutların ortamlarının içeriği üzerinde denetime izin verir.

Kabuklar ayrıca, ayrı yardımcı programlar yoluyla elde edilmesi imkansız veya elverişsiz işlevler uygulayan küçük bir dizi yerleşik komut (yerleşik) sağlar . Örneğin, cd, break, devam ve exec kabuğun dışına uygulanamaz çünkü kabuğun kendisini doğrudan manipüle ederler. Tarih, getopts, kill veya pwd yerleşikleri, diğerlerinin yanı sıra ayrı yardımcı programlarda uygulanabilir, ancak yerleşik komutlar olarak kullanmak daha uygundur. Tüm kabuk yapıları sonraki bölümlerde açıklanmaktadır.

Komutların yürütülmesi esastır, ancak mermilerin gücünün (ve karmaşıklığının) çoğu gömülü programlama dillerinden kaynaklanmaktadır. Herhangi bir üst düzey dil gibi, kabuk da değişkenler, akış denetimi yapıları, alıntı ve işlevler sağlar.

Kabuklar, programlama dilini artırmak yerine özel olarak etkileşimli kullanım için tasarlanmış özellikler sunar. Bu etkileşimli özellikler iş denetimi, komut satırı düzenleme, komut geçmişi ve takma adları içerir. Bu özelliklerin her biri bu kılavuzda açıklanmıştır.

BASH gnu.org:

Bash, GNU işletim sistemi için kabuk veya komut dili yorumlayıcısıdır. İsim, Unix'in Yedinci Baskı Bell Laboratuvarları Araştırma sürümünde ortaya çıkan mevcut Unix kabuk sh'in doğrudan atasının yazarı Stephen Bourne'un bir kelimesi olan 'Bourne-Again SHell' in kısaltmasıdır.

Bash büyük ölçüde sh ile uyumludur ve Korn kabuk ksh ve C kabuk csh'nin kullanışlı özelliklerini içerir. IEEE POSIX spesifikasyonunun (IEEE Standard 1003.1) IEEE POSIX Kabuğu ve Araçları kısmının uyumlu bir uygulaması olması amaçlanmıştır. Hem interaktif hem de programlama kullanımı için sh üzerinde fonksiyonel iyileştirmeler sunar.

GNU işletim sistemi csh sürümü de dahil olmak üzere başka kabuklar sağlarken, Bash varsayılan kabuktur . Diğer GNU yazılımları gibi Bash de oldukça taşınabilir. Şu anda Unix ve diğer birkaç işletim sisteminde hemen hemen her sürümde çalışıyor - MS-DOS, OS / 2 ve Windows platformları için bağımsız olarak desteklenen bağlantı noktaları var.


14

Diğer cevaplar genellikle Bash ile POSIX kabuk standardı arasındaki farkı işaret ediyordu. Bununla birlikte, taşınabilir kabuk komut dosyaları yazarken ve Bash sözdiziminde kullanılırken, tipik bashisms ve karşılık gelen saf POSIX çözümlerinin bir listesi çok kullanışlıdır. Bu liste, Ubuntu varsayılan sistem kabuğu olarak Bash'ten Dash'e geçtiğinde derlenmiştir ve burada bulunabilir: https://wiki.ubuntu.com/DashAsBinSh

Ayrıca, betiğinizde bashisms'i kontrol eden ve betiğinizin taşınabilir olduğundan emin olmak istediğinizde kullanışlı olan checkbashisms adında harika bir araç var .


Temel olarak şu andaki cevabım gerçekten kaygılanıyor. +1
tripleee

7

Bunlar hemen hemen aynıdır fakat bashdaha fazla özelliğe sahiptir - sh(az ya da çok) 'dir eski alt kümesini bash.

shgenellikle Bourne shell, pre77 bash( Bourne *again* shell) ve 1977 yılında yaratılan orijinal anlamına gelir .

Kabuk ile başlayan #!/bin/shveya shkabuğu kullanan komut dosyaları genellikle geriye dönük uyumluluk için bunu yapar. Herhangi bir unix / linux işletim sisteminin bir shkabuğu olacaktır . Ubuntu'da shgenellikle çağırır dashve MacOS'ta bunun özel bir POSIX sürümüdür bash. Bu kabuklar standart uyumlu davranış, hız veya geriye dönük uyumluluk için tercih edilebilir.

bashorijinalinden daha yeni sh, daha fazla özellik ekliyor ve geriye dönük olarak uyumlu olmaya çalışıyor sh. Teoride, shprogramlar devreye girmelidir bash. bashneredeyse tüm linux / unix makinelerinde kullanılabilir ve genellikle varsayılan olarak kullanılır - MacOS varsayılan zsholarak Catalina (10.15) olarak varsayılan dikkate değerdir . FreeBSD, varsayılan olarak bashkurulu olarak gelmez .


shPOSIX'ten çok daha önce. Bugünlerde, shbulduğunuz herhangi birinin en azından POSIX uyumlu olduğunu umarsınız ; ancak eski sistemlerde bu hiçbir şekilde verilmez. POSIX kabuktan çok daha fazlasını standartlaştırır; aslında, işletim sistemi çağrılarının ve kütüphane işlevlerinin standartlaştırılmasının daha önemli olduğunu iddia edebilirsiniz.
tripleee

Daha az kafa karıştırıcı hale getirmek için POSIX ile ilgili şeyleri kaldırdım
Ryan Taylor

3

/bin/shile aynı programı çağırabilir veya çağıramaz /bin/bash.

shen azından POSIX'in gerektirdiği özellikleri destekler (doğru bir uygulama varsayalım). Uzantıları da destekleyebilir.

bash"Bourne Again Shell", sh artı bash'a özgü uzantılar için gereken özellikleri uygular. Tam uzantı grubunu burada açıklamak için çok uzun ve yeni sürümlere göre değişiyor. Farklılıklar bash kılavuzunda belgelenmiştir. Tip info bashve "Bash Özellikleri" bölümüne (şimdiki sürümünde bölüm 6) okumak veya okumak çevrimiçi geçerli belgeleri .


shyalnızca PATHgeçerli kabuğunuzda doğru kurulum varsa size bir POSIX kabuğu verir . POSIX kabuğu veren tanımlanmış bir PATH adı yoktur.
schily

Uzun bir süre, örneğin Solaris'te size bir POSIX kabuğu bile vermek shzorunda değildi .
tripleee

3

bash ve sh iki farklı mermidir. Temelde bash sh, daha fazla özellik ve daha iyi sözdizimi ile. Çoğu komut aynı şekilde çalışır, ancak farklıdır.Bash (bash), birçok kullanılabilir (ancak en yaygın olarak kullanılan) Unix kabuklarından biridir. Bash "Bourne Again SHell" anlamına gelir ve orijinal Bourne mermisinin (sh) değiştirilmesi / iyileştirilmesidir.

Kabuk komut dosyaları herhangi bir kabukta komut dosyası oluştururken, Bash komut dosyaları özellikle Bash için komut dosyalarıdır. Bununla birlikte, pratikte, "kabuk betiği" ve "bash betiği", söz konusu kabuk Bash değilse, genellikle birbirinin yerine kullanılır.

Bunu söyledikten sonra, çoğu sistemde / bin / sh'nin sembolik bir bağlantı olacağını ve sh'yi çağırmayacağınızı fark etmelisiniz. Ubuntu / bin / sh'de bash'a bağlanmak için kullanılır, Linux dağıtımlarında tipik davranış, ancak şimdi dash adı verilen başka bir kabuğa bağlantı olarak değişti. Ben bash, hemen hemen standart (ya da en azından benim deneyimlerime göre) olduğu gibi kullanmak. Aslında, bir bash betiği #! / Bin / sh kullandığında sorunlar ortaya çıkar, çünkü betik yapıcı bağlantının olması gerekmediğinde bash olduğunu varsayar.


0

Farklılıklar olabildiğince kolay: Temel bir anlayışa sahip olduktan sonra, yukarıda yayınlanan diğer yorumları yakalamak daha kolay olacaktır.

Kabuk - "Kabuk" kullanıcı ve işletim sistemi (çekirdek) arasındaki etkileşimi kolaylaştıran bir programdır. Sh, bash, csh, zsh ... vb.Gibi birçok kabuk uygulaması vardır.

Shell programlarından herhangi birini kullanarak, bu kabuk programı tarafından desteklenen komutları yürütebiliriz.

Bash - Bu türetilen B ourne- bir kazanç Sh ell. Bu programı kullanarak, Shell tarafından belirtilen tüm komutları yürütebileceğiz. Ayrıca, bu programa özel olarak eklenen bazı komutları yürütebileceğiz. Bash sh ile geriye dönük uyumluluğa sahiptir.

Sh - Bourne Sh ell'den türetilmiştir . "sh" kabukta belirtilen tüm komutları destekler. Araçlar, bu programı kullanarak, Shell tarafından belirtilen tüm komutları yürütebileceğiz.

Daha fazla bilgi için şunları yapın : - https://man.cx/sh - https://man.cx/bash



POSIX'i anlamaya çalışmıyorum. Cevabınızı inceliyorum ve cevabınızın değer kattığını görmem gerekiyor. Ben öyle düşünmüyorum.
Scratte

Bu küçük açıklamaların yukarıdaki tartışmalarda kullanılan jargonun daha rahat anlaşılmasına yardımcı olacağına inanıyorum. @Scratte
Raihanhbh

-1

Linux işletim sistemi farklı kabuk türleri sunar. Mermilerin ortak birçok komutu olmasına rağmen, her türün kendine özgü özellikleri vardır. Farklı türlerde en çok kullanılan kabukları inceleyelim.

Sh kabuğu:

Sh kabuğu Bourne Kabuğu olarak da bilinir. Sh kabuğu, 1977'de AT & T'nin Bell Laboratuarlarında Stephen Bourne tarafından Unix bilgisayarları için geliştirilen ilk kabuktur. Birçok komut dosyası içerir.

Bash kabuğu:

Bash kabuğu Bourne Again Shell'in kısaltmasıdır. Bash kabuğu çoğu linux dağıtımında varsayılan kabuktur ve Sh Shell'in yerine geçer (Sh kabuğu Bash kabuğunda da çalışır). Bash Shell, Sh shell betiklerinin büyük çoğunluğunu değişiklik yapmadan yürütebilir ve komut satırı düzenleme özelliği de sağlayabilir.


Ken Thompson tarafından daha önceki bir mermi vardı. Bourne kabuğu v7 Unix'te (1979) resmen tanıtıldı.
tripleee
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.