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żenie sh
(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ę jako sh
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 sobie bash
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 również naśladować POSIX, jeśli zostanie wywołany jako sh
.
sh = bash?
Przez długi czas /bin/sh
wskazywał /bin/bash
na większość systemów GNU / Linux. W rezultacie prawie bezpiecznie stało się ignorowanie różnicy między nimi. 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:
- Nowoczesne systemy Debian i Ubuntu,
sh
do dash
których domyślnie prowadzi dowiązanie symboliczne ;
- Busybox , który zwykle jest uruchamiany podczas uruchamiania systemu Linux jako część
initramfs
. Wykorzystuje ash
implementację powłoki.
- BSD i ogólnie wszelkie systemy inne niż Linux. Używa OpenBSD
pdksh
, potomek powłoki Korn. FreeBSD sh
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 możesz dowiedzieć się, na co /bin/sh
wskazuje twój system?
Komplikacja 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:
% 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 -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 wymaga find
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 wiersz «shebang».
Na przykład
#!/bin/sh
użyje sh
(i cokolwiek innego, co wskaże),
#!/bin/bash
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ę, np
#!/bin/dash
Którego użyć
W przypadku moich własnych skryptów wolę sh
z następujących powodów:
- jest ustandaryzowany
- jest o wiele prostszy i łatwiejszy do nauczenia
- jest przenośny w różnych systemach POSIX - nawet jeśli tak się nie dzieje
bash
, trzeba je 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 sh
to bardzo minimalistyczny język programowania.