В Unix говорят, в чем разница между сценарием оболочки и исполняемым файлом?

Ответы:

12

Исполняемый файл относится к любому файлу с установленным исполняемым битом, который может быть выполнен (даже если есть ошибки в реальном запуске программы).

Сценарий оболочки - это конкретный тип исполняемого файла, который предназначен для интерпретации оболочкой с использованием #!директивы для указания интерпретатора.

Крис Даун
источник
12

Сценарий представляет собой файл , который:

  • является читаемым человеком (по крайней мере, для обученного человека, т.е. файл состоит из печатных символов); а также
  • Под интерпретатором понимается инструкция, описывающая поведение программы.

Сценарий оболочки является сценарием которого интерпретатор является оболочкой . В мире Unix «оболочка» относится к семейству оболочек, которые напоминают оболочку Борна ; такие современные оболочки (ash, bash, ksh, zsh,…) соответствуют стандарту оболочки POSIX . В более общем смысле слово «оболочка» может включать в себя другие интерпретаторы команд, такие как csh, tcsh, fish,…


Исполняемый файл является любой файл , который может быть выполнен. Для эффективного выполнения файл должен иметь два свойства:

  • Пользователь должен иметь разрешение на его выполнение. Это можно увидеть с помощью команды ls -l: xсимвол должен присутствовать в столбце разрешений.
  • Формат файла должен быть таким, который система распознает как исполняемый. Исполняемые форматы можно разделить на несколько категорий:

    • Собственные исполняемые файлы, которые состоят из машинного кода, организованного в соответствии с двоичным расположением исполняемых файлов операционной системы. Большинство современных систем Unix используют формат ELF для своих собственных исполняемых файлов.
    • Сценарии. Исполняемый скрипт - это файл, начинающийся со строки shebang , состоящей из двух символов, #!за которыми следует путь к файлу. Чтобы выполнить такой файл, ядро ​​выполняет программу интерпретатора и передает ей путь к сценарию в качестве аргумента.
    • Возможно другие форматы в зависимости от системы. Например, Linux может регистрировать произвольные форматы файлов с помощью средства binfmt_misc . Это позволяет выполнять файлы байт-кода Java через зарегистрированную JVM , исполняемые файлы Windows через Wine и т. Д.

Обратите внимание, что наличие исполняемого файла зависит от системы. Например, двоичный файл amd64 Linux исполняется в системе amd64 Linux, но не в 32-разрядной системе. Бинарный файл для Android не исполняется при обычной установке Linux. Исполняемый файл Windows исполняется только в Linux, если присутствует Wine. Сценарий, который начинается с, #!/usr/local/bin/rubyявляется исполняемым, только если есть программа, расположенная в /usr/local/bin/ruby.


Сценарий оболочки обычно является исполняемым. Но он может быть неисполняемым, если у вас нет разрешения на его выполнение. Вы все еще можете интерпретировать его, передав его явно интерпретатору (например bash /path/to/script) - «имей интерпретировать» - это причудливый способ сказать «выполнить».

Жиль "ТАК - перестань быть злым"
источник
2

оболочки скрипт:

Сценарий оболочки - это серия команд, которые будут интерпретироваться оболочкой (обычно sh или sh-совместимая оболочка, иногда другая).

Имя скрипта может, но не обязательно, заканчиваться на «.sh» или «.bash» или «.csh» и т. Д. (Давая подсказку относительно оболочки, которой он должен быть запущен).

Для ясности предположим, что имя скрипта scriptи оболочка, в которой он должен быть запущен, есть bash.

Типичный способ запустить его в оболочке будет: bash /absolute/path/to/the/scriptили bash ./relative/path/to/the/script. Таким образом, ему не нужно устанавливать исполняемый бит, так как он читается только bash, который затем выполняет содержимое.

Он может также быть установлен + х (исполняемый файл) , чтобы запустить его непосредственно из текущего сеанса оболочки с: / абсолютного / путь / к / в / скрипта (или ./relative/path/to/the/script). Осторожно: по умолчанию, когда запускается таким образом, он запускается через оболочку, которую вы набрали, или через оболочку posix (поведение зависит от ОС), так что это может быть не та оболочка, которой он должен выполняться. Вот почему вы можете (и должны) указать в качестве первой строки скрипта: #! / Path / to / good / shell, который указывает вашей ОС, что этот скрипт действительно должен быть запущен с помощью / path / to / good / shell.

исполняемый:

Исполняемый файл - это файл, в котором установлен бит "x" для пользователя (ей) / группы (групп), для которых он должен быть запущен. Обычно это может быть «двоичный файл» или скрипт.

Совет: file /some/fileможет рассказать вам больше о содержимом файла. Попробуйте file /usr/bin/bashили file /etc/profileпосмотрите несколько примеров.

Оливье Дюлак
источник
Ваше утверждение о том, что скрипты без шебангов выполняются текущей оболочкой, неверно. Поведение зависит от ОС. Как правило, используется либо оболочка POSIX, либо ваша оболочка входа в систему.
Jlliagre
Спасибо за эту точность. Я отредактирую свой ответ, чтобы добавить ваш комментарий.
Оливье Дюлак