Jestem nowy w skryptach powłoki i wiele książek napisało, że używają wiersza #! (Sha-bang) na początku skryptu do wywołania interpretera. A to wywoła nową powłokę dla skryptu i wykona interpretację linia po linii. mojego podstawowego skryptu nadal działa bez magicznej linii.
więc moje pytania to:
- skąd mój podstawowy skrypt dostał interpretera.
- jak skrypt zdołał zlokalizować tłumacza.
teraz powiem ci o moim podstawowym skrypcie, który zawiera tylko następujący wiersz:
echo „podstawowy skrypt bez magicznych linii”
bash
shell-script
użytkownik1678213
źródło
źródło
Odpowiedzi:
Jeśli nie podano magicznej linii, do uruchomienia skryptu używana jest domyślna powłoka. Ta domyślna powłoka może być albo powłoką Bourne'a (sh), co ma miejsce w niektórych smakach, jednak w niektórych innych smakach domyślna powłoka jest taka sama jak powłoka logowania do jej wykonania. Chodzi o to: nie pozostawiaj systemowi decydowania o powłoce, zawsze podaj powłokę, którą chcesz w pierwszym wierszu.
źródło
/bin/sh
, tylko jako pierwszysh
plik wykonywalny znaleziony podczas eksploracji zgodnej ŚCIEŻKI.Po uruchomieniu programu jądro sprawdza, czy zaczyna się od jakiejś sekwencji bajtów magicznych . Jeśli plik wykonywalny zaczyna się od
#!
, jądro interpretuje resztę wiersza jako nazwę interpretera. Jeśli plik wykonywalny zaczyna się od\177ELF
(gdzie\177
jest bajt 127), ładuje plik jako plik wykonywalny ELF ; jest to obecnie normalny rodzaj w większości systemów unixowych.Jeśli jądro nie rozpoznaje formatu pliku, odmawia wykonania pliku i zwraca błąd ENOEXEC (błąd formatu wykonania). Gdy powłoka to zauważy, bierze na siebie wykonanie programu jako skrypt powłoki.
Aby zobaczyć to w akcji, dodaj do skryptu kilka poleceń:
(Dotyczy to Linuksa, dostosuj do innych uników). Następnie spróbuj uruchomić ten skrypt z różnych powłok. Zobaczysz, że niektóre powłoki spawnują nowe instancje, aby wykonać skrypt (bash, ksh93), a inne spawn
/bin/sh
(dash, pdksh, zsh).źródło
ls -l
poleceniem? To:lrwxrwxrwx 1 i 0 Oct 11 05:15 exe -> /bin/bash
-? Jeśli tak, co to mówi? Zauważyłem też, że mamSHELL=/bin/bash
włączonyenv
, ale zmiana nie wydawała się zmieniać zachowania. Może to nie ma związku?ls -l /proc/$$/exe
). Teexe
punkty linki do powłoki, która jest wykonującego skryptu. Po uruchomieniu skryptu zobaczysz, że bash interpretuje skrypt. Jeśli uruchomisz go np. Z pdksh, uruchomi się/bin/sh
. Nie znam żadnej powłoki, któraSHELL
w takich okolicznościach używa zmiennej środowiskowej lub powłoki logowania./etc/passwd
zmienia, która powłoka jest wykonywana, gdy logujesz się przez SSH lub na konsoli tekstowej. Nie zmienia to, która powłoka może wykonywać skrypty./etc/passwd
aby zdecydować, której powłoki użyć, rozwidliły instancję samych siebie lub wykonały/bin/sh
.To prawdopodobnie jedna z następujących 3 możliwości:
Wywołujesz skrypt bezpośrednio za pomocą interpretera, IE: bash script.sh
Nazwa pliku skryptu ma rozszerzenie .sh, które powoduje, że system szuka domyślnego programu dla tego typu pliku
Środowisko powłoki, którego używasz, samo wykonuje „echo”, ponieważ mogę tylko zgadywać, że plik skryptu jest wykonywalny. Jeśli, na przykład, będziesz używał powłoki bash i będziesz mieć w swoim poleceniu polecenie, które jest używane tylko przez ksh, to zobaczysz, że to nie zadziała.
Powodzenia!
źródło