Jeśli chcę wykonać skrypt bash, który nie ma ustawionego uprawnienia do wykonywania, mogę:
bash script.sh
Czego powinienem użyć, bash
jeśli skrypt nie jest wykonywalny i nie znam poprawnego interpretera? Czy istnieje polecenie, które wyszukuje interpreter z linii shebang i wykonuje za jego pomocą skrypt?
bash whatever
działa, po co używać czegoś innego? bash jest dostępny na praktycznie każdym * systemie IX, więc po co zawracać sobieOdpowiedzi:
Tak. Nazywa się to
perl
:Jest to wspomniane w dokumentacji Perla :
źródło
.js
również działa?#!
. Wydaje mi się, że teraz jest ich kilka lub więcej i nie spotkałem się z tym problemem.man perlrun
nieśmiało przyznaje, że to „trochę dziwne” :). Myślę, że należy to potraktować jako ciekawość skierowaną do środowisk innych niż UNIX i bardzo bardzo starych wersji UNIX.Skrypty niekoniecznie mają shebang
Jeśli skrypt był uruchamiany z tłumacza, nie możesz być pewien, że ma shebang w ogóle . Skrypty uruchamiane z interpretera nie wymagają shebang , jeśli wywołasz interpretera w celu uruchomienia kodu.
Odpowiedź brzmi więc nie, nie ma polecenia, które na pewno dowie się, w jakim języku (tłumaczu) uruchamia się skrypt. Zawsze możesz jednak zajrzeć do skryptu i sprawdzić, czy zawiera on shebang.
Zasady w skrócie:
Jeśli jednak skrypt nie ma shebang, w skrypcie nie ma żadnych informacji (bezpośrednich *), które wskazywałyby, jakiego interpretera użyć.
To powiedziawszy
Można oczywiście zawsze napisać skrypt otoki, aby spróbować dowiedzieć się, czy skrypt ma shebang i przeczytać, że od tłumacza, a następnie uruchomić go z Znaleziony tłumacza.
Przykład
Zapisz go jako
tryrun
w$PATH
(na przykład~/bin
, zrobić katalog, jeśli nie istnieje, wylogować iz powrotem), sprawiają, że wykonywalny . Następnie uruchom:wywołuje (testowany) poprawny interpreter na moich plikach wykonywalnych
python
ibash
skryptach.Wyjaśnienie
#!
i używa reszty do wywołania tłumacza.PermissionError
alboFileNotFoundError
.Uwaga
Rozszerzenie (
.sh
,.py
etc) w ogóle nie odgrywa żadnej roli w określaniu odpowiedniego tłumacza w systemie Linux.(* Oczywiście możliwe jest opracowanie „inteligentnego” algorytmu zgadywania w celu określenia składni na podstawie kodu).
źródło
Możesz to osiągnąć za pomocą takiego skryptu:
A zatem:
Nie polecam tego robić. Uprawnienia istnieją z jakiegoś powodu. Jest to program do podważania uprawnień.
Zauważ, że obsługa shebang jest funkcją jądra (w kodzie źródłowym Linuksa -
fs/binfmt_script.c
). Zasadniczo proces wywoływania skryptu bezpośrednio nie wie o tym#!
- jądro używa go do ustalenia, że musi uruchomić interpreter.źródło