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:
Nowoczesne systemy Debian i Ubuntu, shdo dashktórych domyślnie prowadzi dowiązanie symboliczne ;
Busybox , który zwykle jest uruchamiany podczas uruchamiania systemu Linux jako część initramfs. Wykorzystuje ashimplementację powłoki.
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:
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 wymagafind 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. :-)
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 shjestbash . Sprawdzić sh --version.
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).
[[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ć).
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.
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
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.
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
ViCommand line editing N N Y Y Y(3) Y L L
EmacsCommand line editing N N Y Y Y Y L L
RebindableCommand 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
MhMailbox completion N N N N(4) N(6) N(6) N N
CoProcesses 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
CustomPrompt(easily) N N Y Y Y Y Y Y
SunKeyboardHack N N N N N Y N N
SpellingCorrection N N N N Y Y N N
ProcessSubstitution N N N Y(2) N Y Y Y
UnderlyingSyntax sh csh sh sh csh sh rc rc
FreelyAvailable N N N(5) Y Y Y Y Y
ChecksMailbox N Y Y Y Y Y F F
TtySanityChecking 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
ListVariables 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.TheVi 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 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ń.
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 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.
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.
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.
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ń.
Odpowiedzi:
Co to jest sh
sh
(lub Shell Command Language) to język programowania opisany przez standard POSIX . Posiada wiele wdrożeń (ksh88
,dash
...).bash
można również uznać za wdrożeniesh
(patrz poniżej).Ponieważ
sh
specyfikacja, a nie implementacja,/bin/sh
jest dowiązaniem symbolicznym (lub dowiązaniem twardym) do rzeczywistej implementacji w większości systemów POSIX.Co to jest bash
bash
zaczęło się jakosh
implementacja 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 sobiebash
nie jest prawidłową powłoką POSIX. Jest to raczej dialekt języka powłoki POSIX.bash
obsługuje--posix
przełącznik, co czyni go bardziej zgodnym z POSIX. Próbuje także naśladować POSIX, jeśli zostanie wywołany jakosh
.sh = bash?
Przez długi czas
/bin/sh
wskazywał/bin/bash
na 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/sh
nie wskazuje/bin/bash
(a niektóre z nich/bin/bash
mogą nawet nie istnieć) to:sh
dodash
których domyślnie prowadzi dowiązanie symboliczne ;initramfs
. Wykorzystujeash
implementację powłoki.pdksh
, potomek powłoki Korna. FreeBSDsh
jest potomkiem oryginalnej powłoki UNIX Bourne. Solaris ma swój własny,sh
który przez długi czas nie był zgodny z POSIX; darmowa implementacja jest dostępna z projektu Heirloom .Jak dowiedzieć się, na co
/bin/sh
wskazuje twój system?Problem polega na tym, że
/bin/sh
może to być dowiązanie symboliczne lub dowiązanie twarde. Jeśli jest to łącze symboliczne, przenośnym sposobem jego rozwiązania jest:Jeśli jest to twardy link, spróbuj
W rzeczywistości
-L
flaga obejmuje zarówno dowiązania symboliczne, jak i dowiązania twarde, ale wadą tej metody jest to, że nie jest przenośna - POSIX nie wymagafind
obsługi-samefile
opcji, 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
użyje
sh
(i cokolwiek innego, co wskaże),użyje,
/bin/bash
jeś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ę, npKtórego użyć
W przypadku moich własnych skryptów wolę
sh
z następujących powodów: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łysh
to bardzo minimalistyczny język programowania.źródło
bash
wyświetlaczem, bardziej przydatne komunikaty o błędach w przypadku błędu składniowego. Możesz po prostu zaoszczędzić czas, używając bash.%
znaczy na początku linii poleceń?$
zamiast%
lub#
dla powłoki root.$
i#
...sh
istniało na długo przed bash (co oznacza bourne-znowu shell). Ale był bardzo prymitywny i nie reagował na zdarzenia końcowe, takie jakESC
postacie. Potemksh
przyszedł (także przed bash), a potem bash rozpoczęli ci, którzy uwielbiali ideę lepszej powłoki, ale nienawidzili ksh. :-)sh
: http://man.cx/shbash
: http://man.cx/bashTL; DR :
bash
jest nadzbiorem osh
bardziej 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
jestbash
. Sprawdzićsh --version
.źródło
To pytanie było często nominowane jako kanoniczne dla osób, które próbują go użyć
sh
i są zaskoczone, że nie zachowuje się tak samo jakbash
. Oto krótki przegląd typowych nieporozumień i pułapek.Po pierwsze, powinieneś zrozumieć, czego się spodziewać.
sh scriptname
lubscriptname
masz go#!/bin/sh
w linii shebang , powinieneś oczekiwaćsh
zachowania POSIX .bash scriptname
lubscriptname
masz 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 wsh
(tylko ten,[
który jest bardziej niezgrabny i ograniczony).sh
nie ma tablic.local
,source
,function
,shopt
,let
,declare
, iselect
nie są przenośne dosh
. (Niektóresh
implementacje obsługują nplocal
.)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ługiwanash
w systemach, które stosują się tylko do bieżącego Specyfikacja POSIX i prawdopodobnie nie będzie jeszcze przez pewien czas).<<<'here strings'
.*.{png,jpg}
i{0..12}
rozwija nawias klamrowy.Jest to w POSIX, ale może brakować niektórych~
odnosi się$HOME
tylko do Bash (i bardziej ogólnie~username
do katalogu domowegousername
)./bin/sh
implementacji wcześniejszych niż POSIX .<(cmd)
i>(cmd)
.&|
for2>&1 |
i&>
for> ... 2>&1
<>
przekierowaniem.${substring:1:2}
,${variable/pattern/replacement}
konwersja wielkości liter itp.$[expression]
składnia starszego typu, którą jednak należy zastąpić$((expression))
składnią arytmetyczną POSIX . (sh
Jednak niektóre starsze implementacje sprzed POSIX-a mogą tego nie obsługiwać).$RANDOM
,$SECONDS
,$PIPESTATUS[@]
i$FUNCNAME
są rozszerzeniami bash.export variable=value
i[ "x" == "y" ]
które nie są przenośne (export variable
powinny być oddzielne od przypisywania zmiennych, a przenośne porównywanie ciągów[ ... ]
używa pojedynczego znaku równości).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/bash
linii shebang, ale mimosh scriptname
to 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żsh
nie jest to dobry sposób na sprawdzenie, czy twój skrypt jest odpowiednio przenośny doash
/dash
/ POSIXsh
lub wariantów takich jak Heirloomsh
źródło
export variable=value
jest 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.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:
źródło
sh
(więc jest to „podklasa” w sensie OOP) i rozszerza ją (więc ma nadzbiór funkcjonalności).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:
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
źródło
TERMINAL
MUSZLA
SH vs. GRZMOTNĄĆ
SH
GRZMOTNĄĆ
MATERIAŁ REFERENCYJNY:
SHELL gnu.org:
BASH gnu.org:
źródło
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.
źródło
Są prawie identyczne, ale
bash
mają więcej funkcji -sh
jest (mniej więcej) starszym podzbiorembash
.sh
często oznacza oryginałBourne shell
, który poprzedzabash
(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/sh
odsh
powłoki lub używają jej zwykle, robią to w celu zachowania kompatybilności wstecznej. Każdy system operacyjny unix / linux będzie miałsh
powłokę. Na Ubuntush
często wywołuje,dash
a na MacOS jest to specjalna wersja POSIXbash
. Powłoki te mogą być preferowane ze względu na zachowanie zgodne ze standardami, szybkość lub zgodność wsteczną.bash
jest nowszy niż oryginałsh
, dodaje więcej funkcji i stara się być kompatybilny wsteczsh
. Teoretyczniesh
programy powinny się uruchamiaćbash
.bash
jest 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ęzsh
Catalina (10.15). FreeBSD domyślnie nie jestbash
instalowany.źródło
sh
daleko przed POSIX. W dzisiejszych czasach można mieć nadzieję, żesh
wszystko, 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./bin/sh
może, ale nie musi, wywoływać ten sam program co/bin/bash
.sh
obsł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. Wpiszinfo bash
i przeczytaj sekcję „Funkcje Bash” (sekcja 6 w aktualnej wersji) lub przeczytaj aktualną dokumentację online .źródło
sh
daje tylko powłokę POSIX, jeśli masz odpowiedniąPATH
konfigurację w bieżącej powłoce. Nie ma zdefiniowanej nazwy PATH, która daje powłokę POSIX.sh
niekoniecznie nawet dawałem ci powłokę POSIX, na przykład w systemie Solaris.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.
źródło
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
źródło
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ń.
źródło