Widzę dwa rodzaje używanych kodów:
#!/usr/bin/sh
i:
#!/user/bin/bash
Szukałem tego online, a opinie bardzo się różnią. Wyjaśnienia, które widziałem na większości stron internetowych, mówią tak sh
jest starszy niż bash
i że nie ma realnej różnicy.
Czy ktoś zna różnicę między nimi? Czy możesz dać mi praktyczny przykład, kiedy używać jednego nad drugim?
sh
ibash
): http://en.wikipedia.org/wiki/Comparison_of_command_shellsOdpowiedzi:
bash
jest nadzbioremsh
to znaczy. wszystko, co możesz zrobićsh
możesz to zrobićbash
.Bash ma więcej funkcji (rozgałęzianie, wbudowane, tablice) ułatwiając pisanie skryptu. Kilka późniejszych * nix'ów
/bin/sh
jako link do/bin/bash
Pełne wyjaśnienie co oto tutorial
źródło
sh
) nie został przedłużony, ponieważ Bash` został napisany przez kogoś innego. Założę się też, że były problemy z licencją. Przeczytaj artykuł o muszli Bourne'a en.wikipedia.org/wiki/Bourne_shellsh
złamie wiele skryptów, które oczekują, że będzie tam i polegać na sposobie analizowania rzeczy. Użytkownicy Linuksa mogą się tym nie przejmować, ale ludzie wydający tysiące dolarów na Solaris, AIX lub HP-UX mogą być bardzo zirytowani.sh
nie został po prostu rozszerzony: jego kod źródłowy to czyste piekło. Spójrz. Jego domniemany być C ...Tradycyjnie, / bin / sh byłaby oryginalną powłoką Bourne'a, która nie ma historii ani edycji wiersza poleceń, ani żadnej kontroli zadań.
Przez mniej więcej 15 lat większość Unixów miała zainstalowaną powłokę POSIX lub przynajmniej ksh lub bash (które są prawie podobne do POSIX), ale wciąż mają bardziej ograniczoną powłokę w / bin / sh
Powodem tego jest to, że starsze skrypty powłoki, które oczekują starszych
sh
polecenie nadal działa.Ponieważ postacie lubią
{
,}
i!
mają specjalne znaczenie dla basha, możliwe, że starszy skrypt powłoki używający tych znaków (bez ich ucieczki) może zawieść.(Powłoka Bourne'a zajmie
!!{1,2}
dosłownie, podczas gdy bash interpretowałby to jako powtórzenie poprzedniego polecenia (!!
) a następnie rozszerzenie nawiasów klamrowych).Jednak w Linuksie
sh
polecenie jest prawie zawsze tylko linkiem dobash
, ze wszystkimi tymi samymi funkcjami.źródło
sh może oznaczać powłokę Bourne'a lub / bin / sh, która jest inną powłoką (zgodną z POSIX) na większości nowoczesnych platform. „Powłoka POSIX” to streszczenie powłoka zdefiniowana przez POSIX , który jest implementowany przez bash w trybie POSIX lub domyślnie ksh lub dash. / bin / sh jest czasami nazywany także powłoką POSIX, ponieważ jest to powłoka zgodna z POSIX na większości platform. Oryginalne powłoki Bourne'a nie są powłokami POSIX.
bashref ma listę różnice między powłokami bash i Bourne .
man bash
ma listę zmienia się, gdy bash jest wywoływany w trybie POSIX ./ bin / sh nie jest dowiązaniem symbolicznym ani twardym dowiązaniem w systemie OS X, ale ma prawie taki sam rozmiar jak / bin / bash:
człowiek bash :
Naśladowanie powłok Bourne'a jest poza tym dość ograniczone.
bash +B
(Bourne) faktycznie wyłączy funkcje takie jak rozwijanie nawiasów.Ale nawet jeśli wyłączysz tryb POSIX, echo zachowuje się jak
echo -e
domyślnie:/ bin / sh jest kreską Ubuntu , więc trochę bashisms pracuj z / bin / sh na OS X, ale nie na Ubuntu.
Jeśli rzeczywiście chcesz pisać skrypty do (czegoś) oryginalnych powłok Bourne'a, możesz użyć
#!/usr/bin/env bash +B
zamiast.Myślę, że pisanie skryptów dla basha jest łatwiejsze niż unikanie funkcji, które nie są częścią specyfikacji POSIX lub powłok Bourne'a lub testowanie wszystkiego z innymi powłokami.
źródło
Właściwie, nawet jeśli / bin / sh może być linkiem do / bin / bash, jeśli jest uruchamiany, to zachowuje się inaczej. Z podręcznika bash:
Tak jak
sh
, próbuje emulować historyczne zachowanie sh. Tak jakbash
, próbuje być jak najbardziej użyteczny jako interaktywna powłoka logowania.źródło
W wielu systemach, aw szczególności w Solarisie, bash jest dynamicznie połączony, podczas gdy sh jest statycznie połączony. Może to stanowić zagrożenie bezpieczeństwa, dlatego użytkownik root powinien używać tylko / bin / sh jako powłoki (jeśli kiedykolwiek będziesz musiał zalogować się jako root).
źródło
ldconfig
lub Twój/lib
katalog zostanie z jakiegoś powodu wymazany.