W Uniksie mów, jaka jest różnica między skryptem powłoki a plikiem wykonywalnym?

Odpowiedzi:

12

Plik wykonywalny odnosi się do dowolnego pliku z ustawionym zestawem bitów, który można wykonać (nawet jeśli występują błędy w rzeczywistym uruchomieniu programu).

Skrypt powłoki to określony typ pliku wykonywalnego, który ma być interpretowany przez powłokę za pomocą #!dyrektywy w celu określenia interpretera.

Chris Down
źródło
12

Skrypt jest plikiem, który:

  • jest czytelny dla człowieka (przynajmniej dla odpowiednio przeszkolonego człowieka, tzn. plik składa się z drukowalnych znaków); i
  • jest interpretowany przez tłumacza jako instrukcje opisujące zachowanie programu.

Shell skrypt jest skryptem, którego interpreter jest powłoka . W świecie unix „shell” odnosi się do rodziny powłok podobnych do powłoki Bourne'a ; nowoczesne takie muszle (ash, bash, ksh, zsh,…) są zgodne ze standardem powłoki POSIX . Mówiąc bardziej ogólnie, słowo „shell” może obejmować inne interpretatory poleceń, takie jak csh, tcsh, fish,…


Plik wykonywalny to dowolny plik, który można wykonać. Aby można go było skutecznie wykonać, plik musi mieć dwie właściwości:

  • Użytkownik musi mieć uprawnienia do jego wykonania. Można to zobaczyć za pomocą polecenia ls -l: xznak musi znajdować się w kolumnie uprawnień.
  • Format pliku musi być taki, który system rozpoznaje jako wykonywalny. Formaty plików wykonywalnych można podzielić na kilka kategorii:

    • Natywne pliki wykonywalne, które składają się z kodu maszynowego zorganizowanego zgodnie z binarnym układem plików wykonywalnych systemu operacyjnego. Większość współczesnych systemów uniksowych używa formatu ELF dla swoich natywnych plików wykonywalnych.
    • Skrypty Skrypt wykonywalny to plik rozpoczynający się od linii shebang , składającej się z dwóch znaków, #!po których następuje ścieżka do pliku. Aby wykonać taki plik, jądro wykonuje program interpretera i przekazuje mu ścieżkę do skryptu jako argument.
    • Możliwe inne formaty w zależności od systemu. Na przykład Linux może rejestrować dowolne formaty plików za pomocą narzędzia binfmt_misc . Umożliwia to uruchamianie plików kodu bajtowego Java za pośrednictwem zarejestrowanej maszyny JVM , plików wykonywalnych systemu Windows za pośrednictwem Wine itp.

Pamiętaj, że bycie plikiem wykonywalnym zależy od systemu. Na przykład plik binarny systemu Linux amd64 jest wykonywalny w systemie Linux amd64, ale nie w systemie 32-bitowym. Plik binarny dla Androida nie jest wykonywalny podczas normalnej instalacji Linuksa. Plik wykonywalny systemu Windows jest wykonywalny tylko w systemie Linux, jeśli Wine jest obecny. Skrypt, który zaczyna się od, #!/usr/local/bin/rubyjest wykonywalny tylko wtedy, gdy znajduje się program /usr/local/bin/ruby.


Skrypt powłoki zwykle jest wykonywalny. Ale może nie być wykonywalny, jeśli nie masz uprawnień do jego wykonania. Nadal możesz go zinterpretować, przekazując go jawnie tłumaczowi (np. bash /path/to/script) - „czy to zinterpretowano” to fantazyjny sposób powiedzenia „wykonać”.

Gilles „SO- przestań być zły”
źródło
2

Skrypt powłoki:

Skrypt powłoki to seria poleceń, które będą interpretowane przez powłokę (zwykle sh lub powłoka kompatybilna z sh, czasami inna).

Nazwa skryptu może, ale NIE musi, kończyć się na „.sh”, „.bash” lub „.csh” itp. (Dając wskazówkę co do powłoki, którą powinien uruchomić).

Dla jasności założę: że nazwa skryptu to script, a powłoka, w której powinien zostać uruchomiony, to bash.

Typowy sposób uruchomienia go w powłoce to: bash /absolute/path/to/the/scriptlub bash ./relative/path/to/the/script. W ten sposób nie trzeba ustawiać bitu wykonywalnego, ponieważ jest on odczytywany tylko przez bash, który następnie wykonuje zawartość.

Można go również ustawić + x (plik wykonywalny), aby umożliwić uruchomienie go bezpośrednio z bieżącej sesji powłoki za pomocą: / absolut / ścieżka / do / skryptu (lub ./relative/path/to/the/script). Uwaga: domyślnie po uruchomieniu w ten sposób jest uruchamiany przez wpisaną powłokę lub przez powłokę posix (zachowanie zależy od systemu operacyjnego), więc może to nie być powłoka, z której ma ona być uruchamiana. Dlatego możesz (i powinieneś) określić jako pierwszy wiersz skryptu: #! / Path / to / good / shell, który wskazuje systemowi, że ten skrypt powinien zostać uruchomiony przez / path / to / good / shell.

plik wykonywalny:

Plik wykonywalny to plik, który ma ustawiony bit „x” dla użytkownika / grup, dla którego ma zostać uruchomiony. Zazwyczaj może to być „binarny” lub skrypt.

Wskazówka: file /some/filemoże powiedzieć więcej o zawartości pliku. Spróbuj file /usr/bin/bashlub file /etc/profilezobacz kilka przykładów.

Olivier Dulac
źródło
Twoje stwierdzenie o uruchamianiu skryptów bezkrzyżowych przez bieżącą powłokę jest niepoprawne. Zachowanie zależy od systemu operacyjnego. Zasadniczo używana jest powłoka POSIX lub powłoka logowania.
jlliagre,
Dzięki za tę precyzję. Zedytuję odpowiedź, aby dodać komentarz.
Olivier Dulac,