Aby zapewnić przenośność, możesz bezpiecznie założyć, że #!/bin/sh
znajdzie powłokę w większości zgodną z POSIX na każdym standardowym systemie Unix lub Linux, ale to naprawdę wszystko.
We FreeBSD, OpenBSD i NetBSD ( wraz z DragonFly, PC-BSD i kilkoma innymi pochodnymi) bash znajduje się pod adresem /usr/local/bin/bash
(jeśli jest zainstalowany), więc /usr/bin/env
podejście zapewnia przenośność między Linuksem i BSD.
Android nie jest standardowym systemem Unix lub Linux. Na moim niezrootowanym telefonie z Androidem żaden z elementów /usr/bin/env
, /bin/bash
o r nawet /bin/sh
istnieją, a powłoka systemowa to /system/bin/sh
.
Skrypt powłoki, w którym brakuje elementu #!
(shebang) podejmie próbę uruchomienia w powłoce, która go wywołała w niektórych systemach, lub może użyć innego domyślnego interpretera (na przykład /bin/bash
) , w innych systemach. I chociaż to może działać w systemie Android, nie ma gwarancji, że będzie działać w innych systemach operacyjnych, w których użytkownicy mogą zdecydować się na użycie powłoki interaktywnej, która nie jest bash
. (Używam tcsh we FreeBSD, gdzie jest to domyślna powłoka, a skrypt bez shebang jest interpretowany przez wywołującą powłokę.)
Więc z miejsca, w którym siedzę, wygląda na to, że jest niemożliwe utworzenie skryptu powłoki, który byłby przenośny między systemami Android i innymi niż Android (Linux lub Unix), ponieważ Android działa inaczej.
Komentarze
- Z mojego doświadczenia wynika, że
/bin/sh
ma wskazywać na coś bardziej podobnego do bsh
lub dash
niż bash
, który jest stosunkowo rozdęty i dlatego jest preferowany do użytku interaktywnego.
- Kilka błędów w tym miejscu. Nadal jest wiele (głównie komercyjnych) Unices w okolicy (większość z nich to Solaris 10 i starsze), gdzie
/bin/sh
to szela Bournea l, a nie powłoka POSIX, POSIX nie ' t określa ścieżkę do sh
. Większość pocisków (i execp
/ env
/ find -exec...
) będzie interpretować she-bang- less z systemem ' s sh
, niewielu interpretuje to samodzielnie, a kiedy to robi, robi to w trybie zgodności z POSIX. To ' jest standardowym / POSIXowym sposobem uruchamiania skryptu, ale zakłada, że wywołujący znajduje się w środowisku POSIX .
- Odnośnie * BSD
bash
jest opcjonalne. Oznacza to, że są duże szanse, że nawet /usr/local/bin/bash
nie istnieje w systemach (nie wspominając o zastrzeżonych systemach, takich jak Solaris, AIX lub HP-Ux).
- @ StephaneChazelas – re POSIX, zgadzam się oczywiście i że ' dlaczego użyte przeze mnie słowa były " zgodne z POSIX = „52048f80fb”>
. Ale to pytanie dotyczyło przenośności, a nie tego, gdzie znaleźć POSIX, i nie można ' polegać na powłoce zawsze znajdującej się w jednym miejscu. Jeśli chodzi o domyślny interpreter, skrypt bez shebang uruchamiany w tcsh jest interpretowany przez tcsh we FreeBSD. Oczywiście jest też ' niespójność, więc ' odpowiednio zaktualizowałem odpowiedź.