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 również 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 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/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 Korn. 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 możesz dowiedzieć się, na co /bin/shwskazuje twój system?
Komplikacja 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 wiersz «shebang».
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 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 shto bardzo minimalistyczny język programowania.