Różnica między sh i bash


1303

Podczas pisania programów powłoki często używamy /bin/shi /bin/bash. Zwykle używam bash, ale nie wiem, jaka jest między nimi różnica.

Jaka jest główna różnica między bashi sh?

O czym musimy pamiętać, programując w bashi sh?


21
Przydatna lista bashizmów i odpowiadającego im kodu, który działa na powłoce Bourne'a, znajduje się na stronie mywiki.wooledge.org/Bashism
StackExchange saddens dancek 20.04.11

1
Możesz chcieć zobaczyć standard POSIX dla sh i jego języka poleceń: * sh * Shell Command Language
Maurício C Antunes

7
zgodnie z ogólną zasadą wszystkie skrypty sh będą działały w trybie bash dzięki kompatybilności z POSIX-em, ale nie wszystkie skrypty bash mogą działać w sh, główne różnice, które zauważasz, to takie jak [[]] zamiast [] porównań, które pozwalają na cudzysłowy, $ (()) zamiast wyrażeń arytmetycznych $ [] i inne rzeczy, takie jak „jest za duży i za wolny” bezpośrednio z dokumentów bash. Ale nowi skrypty nie muszą ograniczać się do skryptów kompatybilnych z SH, chyba że strzelają dla niektórych wsteczna kompatybilność, co obecnie najczęściej nie ma miejsca, w końcu to (lub był ...) rok 2014 prawda?
osirisgothra

Odpowiedzi:


1140

Co to jest sh

sh(lub Shell Command Language) to język programowania opisany przez standard POSIX . Posiada wiele wdrożeń ( ksh88, dash...). bashmożna również uznać za wdrożenie sh(patrz poniżej).

Ponieważ shspecyfikacja, a nie implementacja, /bin/shjest dowiązaniem symbolicznym (lub dowiązaniem twardym) do rzeczywistej implementacji w większości systemów POSIX.

Co to jest bash

bashzaczęło się jako shimplementacja kompatybilna (chociaż wyprzedza standard POSIX o kilka lat), ale z czasem zyskała wiele rozszerzeń. Wiele z tych rozszerzeń może zmienić zachowanie prawidłowych skryptów powłoki POSIX, więc samo w sobie bashnie jest prawidłową powłoką POSIX. Jest to raczej dialekt języka powłoki POSIX.

bashobsługuje --posixprzełącznik, co czyni go bardziej zgodnym z POSIX. Próbuje także naśladować POSIX, jeśli zostanie wywołany jako sh.

sh = bash?

Przez długi czas /bin/shwskazywał /bin/bashna większość systemów GNU / Linux. W rezultacie zignorowanie różnicy między nimi stało się prawie bezpieczne. Ale to zaczęło się ostatnio zmieniać.

Niektóre popularne przykłady systemów, na które /bin/shnie wskazuje /bin/bash(a niektóre z nich /bin/bashmogą nawet nie istnieć) to:

  1. Nowoczesne systemy Debian i Ubuntu, shdo dashktórych domyślnie prowadzi dowiązanie symboliczne ;
  2. Busybox , który zwykle jest uruchamiany podczas uruchamiania systemu Linux jako część initramfs. Wykorzystuje ashimplementację powłoki.
  3. BSD i ogólnie wszelkie systemy inne niż Linux. Używa OpenBSD pdksh, potomek powłoki Korna. FreeBSD shjest potomkiem oryginalnej powłoki UNIX Bourne. Solaris ma swój własny, shktóry przez długi czas nie był zgodny z POSIX; darmowa implementacja jest dostępna z projektu Heirloom .

Jak dowiedzieć się, na co /bin/shwskazuje twój system?

Problem polega na tym, że /bin/shmoże to być dowiązanie symboliczne lub dowiązanie twarde. Jeśli jest to łącze symboliczne, przenośnym sposobem jego rozwiązania jest:

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

Jeśli jest to twardy link, spróbuj

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

W rzeczywistości -Lflaga obejmuje zarówno dowiązania symboliczne, jak i dowiązania twarde, ale wadą tej metody jest to, że nie jest przenośna - POSIX nie wymaga find obsługi -samefileopcji, chociaż zarówno GNU find, jak i FreeBSD ją obsługują.

Linia Shebang

Ostatecznie to Ty decydujesz, którego użyć, pisząc linię «shebang» jako pierwszą linię skryptu.

Na przykład

#!/bin/sh

użyje sh(i cokolwiek innego, co wskaże),

#!/bin/bash

użyje, /bin/bashjeśli jest dostępny (i zakończy się niepowodzeniem z komunikatem o błędzie, jeśli nie jest). Oczywiście możesz również określić inną implementację, np

#!/bin/dash

Którego użyć

W przypadku moich własnych skryptów wolę shz następujących powodów:

  • jest ustandaryzowany
  • jest o wiele prostszy i łatwiejszy do nauczenia
  • jest przenośny w systemach POSIX - nawet jeśli tak się nie dzieje bash, trzeba to miećsh

Istnieją również zalety korzystania z niego bash. Jego funkcje sprawiają, że programowanie jest wygodniejsze i podobne do programowania w innych współczesnych językach programowania. Należą do nich takie zmienne lokalne i tablice o zasięgu. Zwykły shto bardzo minimalistyczny język programowania.


Jeśli uruchomisz skrypt z bashwyświetlaczem, bardziej przydatne komunikaty o błędach w przypadku błędu składniowego. Możesz po prostu zaoszczędzić czas, używając bash.
PHPst

Co %znaczy na początku linii poleceń?
JosephHarriott

@JosephHarriott jest to znak zachęty: znak drukowany przez samą powłokę, po którym następuje polecenie. Niektóre powłoki używają $zamiast %lub #dla powłoki root.
Roman Cheplyaka

@RomanCheplyaka które muszle? Widziałem tylko $i #...
JosephHarriott

@RomanCheplyaka Jestem pewien, że shistniało na długo przed bash (co oznacza bourne-znowu shell). Ale był bardzo prymitywny i nie reagował na zdarzenia końcowe, takie jak ESCpostacie. Potem kshprzyszedł (także przed bash), a potem bash rozpoczęli ci, którzy uwielbiali ideę lepszej powłoki, ale nienawidzili ksh. :-)
raminr

145

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

TL; DR : bashjest nadzbiorem o shbardziej eleganckiej składni i większej funkcjonalności. Korzystanie z linii shebang bash jest bezpieczne w prawie wszystkich przypadkach, ponieważ jest dość wszechobecne na nowoczesnych platformach.

Uwaga: w niektórych środowiskach sh jest bash . Sprawdzić sh --version.


31
jeśli bash jest wywoływany jako sh, zachowuje się nieco inaczej. Zobacz gnu.org/software/bash/manual/bashref.html#Bash-Startup-Files („ Invoked with name sh”) i gnu.org/software/bash/manual/bashref.html#Bash-POSIX-Mode . Na przykład brak podstawienia procesu.
glenn jackman

11
Ponieważ bash jest nadzbiorem sh, a niektóre systemy operacyjne, takie jak FreeBSD, nie mają domyślnie zainstalowanej bash, skryptowanie w sh zapewni większą przenośność.
user674062,

1
Ponieważ nie ma przenośnego, skryptowalnego sposobu na uzyskanie powłoki POSIX dla określonego skryptu, przenośne skrypty nie mogą przyjmować więcej niż funkcje Bourne Shell.
schily

83

To pytanie było często nominowane jako kanoniczne dla osób, które próbują go użyć shi są zaskoczone, że nie zachowuje się tak samo jak bash. Oto krótki przegląd typowych nieporozumień i pułapek.

Po pierwsze, powinieneś zrozumieć, czego się spodziewać.

  • Jeśli uruchamiasz skrypt za pomocą sh scriptnamelub scriptnamemasz go #!/bin/shw linii shebang , powinieneś oczekiwać shzachowania POSIX .
  • Jeśli uruchamiasz skrypt ze skryptem bash scriptnamelub scriptnamemasz go #!/bin/bash(lub lokalny odpowiednik) w linii shebang, powinieneś spodziewać się zachowania Bash.

Posiadanie poprawnego shebang i uruchamianie skryptu poprzez wpisanie tylko nazwy skryptu (ewentualnie z względną lub pełną ścieżką ) jest ogólnie preferowanym rozwiązaniem. Oprócz poprawnego shebang wymaga to, aby plik skryptu miał uprawnienia do wykonywania ( chmod a+x scriptname).

Czym się właściwie różnią?

Podręcznik Bash Reference zawiera sekcję, która próbuje wyliczyć różnice, ale niektóre z powszechnych źródeł nieporozumień obejmują

  • [[nie jest dostępny w sh(tylko ten, [który jest bardziej niezgrabny i ograniczony).
  • sh nie ma tablic.
  • Niektóre słowa kluczowe Bash podoba local, source, function, shopt, let, declare, i selectnie są przenośne do sh. (Niektóre shimplementacje obsługują np local.)
  • Bash ma wiele rozszerzeń składni w stylu C, takich jak for((i=0;i<=3;i++))pętla +=trzyargumentowa, przypisanie przyrostu itp. Ta $'string\nwith\tC\aescapes'funkcja jest wstępnie akceptowana dla POSIX (co oznacza, że ​​działa teraz w Bash, ale nie będzie jeszcze obsługiwana shw systemach, które stosują się tylko do bieżącego Specyfikacja POSIX i prawdopodobnie nie będzie jeszcze przez pewien czas).
  • Obsługuje Bash <<<'here strings'.
  • Bash ma *.{png,jpg}i {0..12}rozwija nawias klamrowy.
  • ~odnosi się $HOMEtylko do Bash (i bardziej ogólnie ~usernamedo katalogu domowego username).Jest to w POSIX, ale może brakować niektórych /bin/shimplementacji wcześniejszych niż POSIX .
  • Bash ma podstawienie procesu za pomocą <(cmd)i >(cmd).
  • Bash ma aliasy przekierowania wygody w stylu Csh, takie jak &|for 2>&1 |i &>for> ... 2>&1
  • Bash obsługuje koprocesy z <>przekierowaniem.
  • Bash oferuje bogaty zestaw rozszerzonych niestandardowych rozszerzeń parametrów, takich jak ${substring:1:2}, ${variable/pattern/replacement}konwersja wielkości liter itp.
  • Bash ma znacznie rozszerzone możliwości arytmetyki powłoki (choć nadal nie obsługuje zmiennoprzecinkowych). Istnieje przestarzała $[expression]składnia starszego typu, którą jednak należy zastąpić $((expression))składnią arytmetyczną POSIX . ( shJednak niektóre starsze implementacje sprzed POSIX-a mogą tego nie obsługiwać).
  • Zmienne magiczne podoba $RANDOM, $SECONDS, $PIPESTATUS[@]i $FUNCNAMEsą rozszerzeniami bash.
  • Różnice składniowe, takie jak export variable=valuei [ "x" == "y" ]które nie są przenośne ( export variablepowinny być oddzielne od przypisywania zmiennych, a przenośne porównywanie ciągów [ ... ]używa pojedynczego znaku równości).
  • Wiele, wiele tylko rozszerzeń Bash, aby włączyć lub wyłączyć opcjonalne zachowanie i ujawnić wewnętrzny stan powłoki.
  • Wiele, wiele wygodnych funkcji do użytku interaktywnego, które jednak nie wpływają na zachowanie skryptu.

Pamiętaj, że jest to skrócona lista. Pełna instrukcja znajduje się w podręczniku użytkownika, a http://mywiki.wooledge.org/Bashism zawiera wiele dobrych obejść; i / lub wypróbuj http://shellcheck.net/, który ostrzega przed wieloma funkcjami tylko Bash.

Częstym błędem jest posiadanie #!/bin/bashlinii shebang, ale mimo sh scriptnameto uruchamianie skryptu. Zasadniczo wyłącza to funkcjonalność tylko Bash, więc pojawiają się błędy składniowe, np. Przy próbie użycia tablic. (Linia shebang jest składniowo komentarzem, więc w tym scenariuszu jest po prostu ignorowana).

Niestety, Bash nie ostrzeże, gdy spróbujesz użyć tych konstrukcji, gdy zostanie wywołany jako sh. Nie wyłącza też całkowicie wszystkich funkcji tylko Bash, więc uruchomienie Bash przez jego wywołanie, ponieważ shnie jest to dobry sposób na sprawdzenie, czy twój skrypt jest odpowiednio przenośny do ash/ dash/ POSIX shlub wariantów takich jak Heirloomsh


2
Zasadniczo wersja TL; DR jest odpowiedzią And .
tripleee

4
Shellcheck.net było wszystkim, czego potrzebowałem. Wielkie dzięki.
Josh Habdas

FWIW, export variable=valuejest upoważniony przez POSIX: pubs.opengroup.org/onlinepubs/009695399/utilities/export.html . Być może nie jest dostępny w niektórych starożytnych pociskach, ale zdecydowanie nie jest to bzdura.
Roman Cheplyaka

53

Shell to interfejs między użytkownikiem a systemem operacyjnym umożliwiający dostęp do usług systemu operacyjnego. Może to być GUI lub CLI (interfejs wiersza poleceń).

sh (Bourne sh ell) to interpreter wiersza poleceń powłoki dla systemów operacyjnych Unix / podobnych do Unixa. Zapewnia niektóre wbudowane polecenia. W języku skryptowym oznaczamy tłumacza jako #!/bin/sh. Był to jeden z najczęściej obsługiwanych przez inne powłoki, takie jak bash (wolny / otwarty), kash (nie wolny).

Bash ( B ourne danej zyskać s piekła) jest zastąpienie powłoki dla powłoki Bourne. Bash jest nadzbiorem sh. Bash obsługuje sh. POSIX to zestaw standardów określających sposób działania systemów zgodnych z POSIX. Bash nie jest w rzeczywistości powłoką zgodną z POSIX. W języku skryptowym oznaczamy tłumacza jako #!/bin/bash.

Analogia:

  • Shell jest jak interfejs, specyfikacje lub API.
  • sh jest klasą, która implementuje interfejs Shell.
  • Bash jest podklasą sh.

wprowadź opis zdjęcia tutaj


3
Nie rozumiem Wspomniałeś zarówno „Bash jest nadzbiorem sh”, jak i „Bash jest podklasą sh”, czy nie są to sprzeczne stwierdzenia? Czy możesz wyjaśnić?
Keerthana Prabhakaran

11
Myślę, że to próbuje powiedzieć, że Bash dziedziczy sh(więc jest to „podklasa” w sensie OOP) i rozszerza ją (więc ma nadzbiór funkcjonalności).
tripleee

52

Wpis z UNIX.COM

Funkcje powłoki

W poniższej tabeli wymieniono większość funkcji, które moim zdaniem sprawiłyby, że wybrałeś jedną powłokę nad drugą. Nie ma być ostateczną listą i nie obejmuje każdej możliwej funkcji dla każdej możliwej powłoki. Funkcja jest uważana za znajdującą się w powłoce tylko w wersji dostarczonej z systemem operacyjnym lub jeśli jest dostępna jako skompilowana bezpośrednio ze standardowej dystrybucji. W szczególności podana poniżej powłoka C jest dostępna w systemie SUNOS 4. *, znaczna liczba dostawców obecnie wysyła zamiast niej tcsh lub własną ulepszoną powłokę C (nie zawsze widać, że wysyłają tcsh.

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

Klucz do powyższej tabeli.

Funkcję Y można wykonać za pomocą tej powłoki.

Funkcja N nie jest obecna w powłoce.

F Funkcję można wykonać tylko przy użyciu mechanizmu funkcji powłok.

L Biblioteka readline musi być połączona z powłoką, aby włączyć tę funkcję.

Uwagi do powyższej tabeli

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.

Twój stół nie jest dla mnie przydatny, ponieważ próbuje porównać cechy powłoki Bourne'a i cechy z ksh sprzed 1988 roku. Jeśli naprawdę stworzysz tabelę na rok 1988, musisz usunąć większość innych powłok z tego stołu - w tym bash , sh i rc. Czy możesz wyjaśnić, skąd masz wartości dla swojej tabeli?
schily

1
Pozwól, że dam kilka wskazówek: Kontrola zadań została dodana do powłoki Bourne'a w 1989 r., A powłoka Bourne'a została utworzona jako OpenSource w 2005 r. Powłoka Korna ma podstawianie procesów od co najmniej 1988 r., A jest to OpenSource od 1997 r. BTW: twoje oświadczenia dotyczące $ ENV nie są poprawne, $ ENV jest odczytywany / wykonywany tylko dla interaktywnych powłok.
schily

3
@schily Ten post został przechwycony z cs.virginia.edu/helpnet/Computer_OS/unix/shells/shelldiff.html
SriniV

@schily Jeśli uważasz, że jest gdziekolwiek niepoprawny, możesz go odpowiednio edytować.
SriniV

8
Na podstawie tego, co schily ujawniło, wydaje się, że lepiej byłoby usunąć tę odpowiedź, ponieważ jest ona zasadniczo fałszywa, a OP tak naprawdę nie zweryfikował wklejonych informacji.
danno

24

TERMINAL

  • programy, które powodują otwarcie okna
  • xterm, rxvt, konsole, kvt, gnome-terminal, nxterm i eterm.

MUSZLA

  • To program działający w terminalu
  • Shell jest zarówno tłumaczem poleceń, jak i językiem programowania
  • Shell to po prostu makroprocesor, który wykonuje polecenia.
  • Makroprocesor oznacza funkcjonalność polegającą na rozszerzaniu tekstu i symboli w celu tworzenia większych wyrażeń.

SH vs. GRZMOTNĄĆ

SH

  • (Muszla)
  • Jest specyficzną powłoką
  • interpreter poleceń i język programowania
  • Poprzednik BASH

GRZMOTNĄĆ

  • (Bourne-Again SHell)
  • Jest specyficzną powłoką
  • interpreter poleceń i język programowania
  • Ma funkcjonalność sh i więcej
  • Następca SH
  • BASH jest domyślnym SHELL

MATERIAŁ REFERENCYJNY:

SHELL gnu.org:

U podstawy powłoka jest po prostu makroprocesorem, który wykonuje polecenia. Termin makroprocesor oznacza funkcjonalność polegającą na rozszerzaniu tekstu i symboli w celu tworzenia większych wyrażeń.

Powłoka uniksowa to zarówno interpreter poleceń, jak i język programowania. Jako interpreter poleceń powłoka zapewnia interfejs użytkownika dla bogatego zestawu narzędzi GNU. Funkcje języka programowania pozwalają łączyć te narzędzia. Pliki zawierające polecenia można tworzyć i same stać się poleceniami. Te nowe polecenia mają taki sam status, jak polecenia systemowe w katalogach takich jak / bin, umożliwiając użytkownikom lub grupom tworzenie niestandardowych środowisk w celu automatyzacji ich typowych zadań.

Muszle mogą być używane interaktywnie lub nieinteraktywnie. W trybie interaktywnym akceptują dane wpisywane z klawiatury. Podczas wykonywania w sposób nieinteraktywny powłoki wykonują polecenia odczytane z pliku.

Powłoka umożliwia wykonywanie poleceń GNU, zarówno synchronicznie, jak i asynchronicznie. Powłoka czeka na zakończenie poleceń synchronicznych, zanim zaakceptuje więcej danych wejściowych; polecenia asynchroniczne są wykonywane równolegle z powłoką, podczas gdy odczytuje i wykonuje dodatkowe polecenia. Konstrukcje przekierowujące umożliwiają precyzyjną kontrolę wejścia i wyjścia tych poleceń. Ponadto powłoka pozwala kontrolować zawartość środowiska poleceń.

Powłoki zapewniają również niewielki zestaw wbudowanych poleceń (wbudowanych) implementujących funkcje niemożliwe lub niewygodne do uzyskania za pomocą oddzielnych narzędzi . Na przykład cd, break, Continue i exec nie mogą być implementowane poza powłoką, ponieważ bezpośrednio manipulują samą powłoką. Wbudowane funkcje historii, getopts, kill lub pwd mogą być zaimplementowane w osobnych narzędziach, ale wygodniej jest ich używać jako poleceń wbudowanych. Wszystkie wbudowane powłoki zostały opisane w kolejnych sekcjach.

Podczas gdy wykonywanie poleceń jest niezbędne, większość mocy (i złożoności) powłok wynika z ich wbudowanych języków programowania. Jak każdy język wysokiego poziomu, powłoka udostępnia zmienne, konstrukcje kontroli przepływu, cytowanie i funkcje.

Powłoki oferują funkcje ukierunkowane specjalnie na użytek interaktywny, a nie na rozszerzenie języka programowania. Te interaktywne funkcje obejmują kontrolę zadań, edycję wiersza poleceń, historię poleceń i aliasy. Każda z tych funkcji jest opisana w tym podręczniku.

BASH gnu.org:

Bash jest powłoką lub interpretatorem języka poleceń dla systemu operacyjnego GNU. Nazwa jest akronimem „Bourne-Again SHell”, gry słów Stephena Bourne'a, autora bezpośredniego przodka obecnej wersji powłoki uniksowej sh, która pojawiła się w siódmej edycji Bell Labs Research w wersji Unix.

Bash jest w dużej mierze kompatybilny z sh i zawiera przydatne funkcje z Ksh powłoki Korn i csh powłoki C. Ma być zgodną implementacją części IEEE POSIX Shell and Tools specyfikacji IEEE POSIX (IEEE Standard 1003.1). Oferuje ulepszenia funkcjonalne w stosunku do sh zarówno do użytku interaktywnego, jak i programowania.

Podczas gdy system operacyjny GNU udostępnia inne powłoki, w tym wersję csh, Bash jest powłoką domyślną . Podobnie jak inne oprogramowanie GNU, Bash jest dość przenośny. Obecnie działa na prawie każdej wersji Uniksa i kilku innych systemach operacyjnych - istnieją niezależnie obsługiwane porty dla MS-DOS, OS / 2 i platform Windows.


14

Inne odpowiedzi ogólnie wskazywały na różnicę między Bash a standardem powłoki POSIX. Jednak podczas pisania przenośnych skryptów powłoki i przyzwyczajania się do składni Bash, lista typowych bashizmów i odpowiadających im czystych rozwiązań POSIX jest bardzo przydatna. Taka lista została opracowana, gdy Ubuntu przełączyło się z Bash na Dash jako domyślna powłoka systemowa i można ją znaleźć tutaj: https://wiki.ubuntu.com/DashAsBinSh

Ponadto istnieje świetne narzędzie o nazwie checkbashisms, które sprawdza skrypty w skrypcie i jest przydatne, gdy chcesz się upewnić, że twój skrypt jest przenośny.


Właśnie do tego tak naprawdę sprowadza się moja odpowiedź. +1
potrójny

7

Są prawie identyczne, ale bashmają więcej funkcji - shjest (mniej więcej) starszym podzbiorem bash.

shczęsto oznacza oryginał Bourne shell, który poprzedza bash( Bourne *again* shell) i został stworzony w 1977 roku. W praktyce jednak lepiej jest myśleć o nim jako o wysoce kompatybilnej krzyżowo powłoce zgodnej ze standardem POSIX z 1992 roku.

Skrypty, które zaczynają się #!/bin/shod shpowłoki lub używają jej zwykle, robią to w celu zachowania kompatybilności wstecznej. Każdy system operacyjny unix / linux będzie miał shpowłokę. Na Ubuntu shczęsto wywołuje, dasha na MacOS jest to specjalna wersja POSIX bash. Powłoki te mogą być preferowane ze względu na zachowanie zgodne ze standardami, szybkość lub zgodność wsteczną.

bashjest nowszy niż oryginał sh, dodaje więcej funkcji i stara się być kompatybilny wstecz sh. Teoretycznie shprogramy powinny się uruchamiać bash. bashjest dostępny na prawie wszystkich maszynach z linuksem / unixie i zwykle jest używany domyślnie - z wyjątkiem tego, że MacOS ma domyślną wersję zshCatalina (10.15). FreeBSD domyślnie nie jest bashinstalowany.


shdaleko przed POSIX. W dzisiejszych czasach można mieć nadzieję, że shwszystko, co znajdziesz, jest co najmniej zgodne z POSIX; ale w starszych systemach nie jest to wcale dane. POSIX rozwija znacznie więcej niż powłokę; w rzeczywistości można argumentować, że standaryzacja wywołań systemu operacyjnego i funkcji bibliotecznych jest ważniejsza.
tripleee

Usunąłem informacje o POSIX, aby było mniej mylące
Ryan Taylor,

3

/bin/shmoże, ale nie musi, wywoływać ten sam program co /bin/bash.

shobsługuje przynajmniej funkcje wymagane przez POSIX (przy założeniu poprawnej implementacji). Może także obsługiwać rozszerzenia.

bash, „Bourne Again Shell”, implementuje funkcje wymagane dla sh oraz rozszerzeń specyficznych dla bash. Pełny zestaw rozszerzeń jest zbyt długi, aby go tu opisać, i różni się w zależności od nowych wydań. Różnice są udokumentowane w podręczniku bash. Wpisz info bashi przeczytaj sekcję „Funkcje Bash” (sekcja 6 w aktualnej wersji) lub przeczytaj aktualną dokumentację online .


shdaje tylko powłokę POSIX, jeśli masz odpowiednią PATHkonfigurację w bieżącej powłoce. Nie ma zdefiniowanej nazwy PATH, która daje powłokę POSIX.
schily

Przez długi czas shniekoniecznie nawet dawałem ci powłokę POSIX, na przykład w systemie Solaris.
tripleee

3

bash i sh to dwie różne powłoki. Zasadniczo bash jest sh, z większą liczbą funkcji i lepszą składnią. Większość poleceń działa tak samo, ale są różne. Bash (bash) jest jedną z wielu dostępnych (ale najczęściej używanych) powłok uniksowych. Bash oznacza „Bourne Again SHell” i jest zamiennikiem / ulepszeniem oryginalnej powłoki Bourne'a (sh).

Skrypty powłoki to skrypty w dowolnej powłoce, podczas gdy skrypty Bash to skrypty specjalnie dla Bash. W praktyce jednak „skrypt powłoki” i „skrypt basha” są często używane zamiennie, chyba że dana powłoka nie jest Bash.

Powiedziawszy to, powinieneś zdać sobie sprawę, że / bin / sh na większości systemów będzie dowiązaniem symbolicznym i nie wywoła sh. W Ubuntu / bin / sh używane do łączenia z bash, typowe zachowanie w dystrybucjach Linuksa, ale teraz zmieniło się na linkowanie do innej powłoki o nazwie dash. Używałbym bash, ponieważ jest to w zasadzie standard (lub przynajmniej najczęstszy, z mojego doświadczenia). W rzeczywistości pojawiają się problemy, gdy skrypt bash użyje #! / Bin / sh, ponieważ twórca skryptów zakłada, że ​​link ma bash, gdy nie musi.


0

Różnice są tak proste, jak to tylko możliwe: po zrozumieniu podstaw, inne komentarze zamieszczone powyżej będą łatwiejsze do złapania.

Shell - „Shell” to program, który ułatwia interakcję między użytkownikiem a systemem operacyjnym (jądrem). Dostępnych jest wiele implementacji powłoki, takich jak sh, bash, csh, zsh ... itp.

Za pomocą dowolnego programu Shell będziemy mogli wykonywać polecenia obsługiwane przez ten program powłoki.

Bash - To pochodzi od B ourne- a zysk Sh Ell. Za pomocą tego programu będziemy mogli wykonywać wszystkie polecenia określone przez Shell. Ponadto będziemy mogli wykonywać niektóre polecenia specjalnie dodane do tego programu. Bash ma kompatybilność wsteczną z sh.

Sh - Pochodzi z Bourne Sh ell. „sh” obsługuje wszystkie polecenia określone w powłoce. Oznacza to, że za pomocą tego programu będziemy mogli wykonywać wszystkie polecenia określone przez Shell.

Aby uzyskać więcej informacji, wykonaj: - https://man.cx/sh - https://man.cx/bash


Aby zrozumieć POSIX, przeczytaj odpowiedź Alexa Sprawdź: stackoverflow.com/a/1780614/1261003
Raihanhbh

Nie próbuję zrozumieć POSIX. Sprawdzam twoją odpowiedź i jako taka muszę ją zobaczyć, twoja odpowiedź dodaje wartości. Nie sądzę, że tak.
Scratte

Uważam, że te małe wyjaśnienia pomogłyby nowicjuszowi lepiej zrozumieć żargon użyty w powyższych dyskusjach. @Scratte
Raihanhbh

-1

System operacyjny Linux oferuje różne rodzaje powłok. Chociaż powłoki mają wiele wspólnych poleceń, każdy typ ma unikalne cechy. Przyjrzyjmy się różnego rodzaju najczęściej używanym pociskom.

Powłoka Sh:

Sh shell jest również znany jako Bourne Shell. Sh shell jest pierwszą powłoką opracowaną dla komputerów z systemem Unix przez Stephena Bourne'a w AT & T's Bell Labs w 1977 roku. Zawiera wiele narzędzi skryptowych.

Powłoka Bash:

Bash shell oznacza Bourne Again Shell. Powłoka Bash jest domyślną powłoką w większości dystrybucji Linuksa i zastępuje powłokę Sh Shell (powłoka Sh będzie również działać w powłoce Bash). Bash Shell może wykonywać większość skryptów powłoki Sh bez modyfikacji i zapewnia również funkcję edycji wiersza poleceń.


Była wcześniejsza skorupa Kena Thompsona. Powłoka Bourne'a została oficjalnie wprowadzona w v7 Unix (1979).
tripleee
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.