У Unix говорять, чим відрізняється скрипт оболонки та виконуваний файл?


Відповіді:


12

Виконавчий файл посилається на будь-який файл із набором виконуваного біта, який міг би бути виконаний (навіть якщо є фактичні помилки в реальному виконанні програми).

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


12

Сценарій є файлом , який:

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

Сценарій оболонки є сценарієм якого інтерпретатор є оболонкою . У світі Unix "оболонка" відноситься до сімейства оболонок, що нагадують оболонку Борна ; сучасні такі снаряди (зола, баш, кш, зш, ...) відповідають стандарту оболонки 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, якщо він присутній. Сценарій, який починається з, #!/usr/local/bin/rubyвиконується лише в тому випадку, якщо на ньому знаходиться програма /usr/local/bin/ruby.


Сценарій оболонки зазвичай виконується. Але він може бути невиконаним, якщо у вас немає дозволу на його виконання. Ви все ще можете його інтерпретувати, передаючи його явно інтерпретатору (наприклад, bash /path/to/script- "інтерпретувати це" - це фантазійний спосіб сказати "виконати".


2

shell-скрипт:

Сценарій оболонки - це ряд команд, які будуть інтерпретовані оболонкою (як правило, ш або ш-сумісна оболонка, іноді інша.)

Ім'я сценарію може, але НЕ потрібно, закінчуватися на ".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подивіться деякі приклади.


Ваша заява про сценарії shebangless, якими керує ваша поточна оболонка, невірна. Поведінка залежить від ОС. Зазвичай використовується оболонка POSIX або оболонка для входу.
jlliagre

Дякую за цю точність. Я відредагую свою відповідь, щоб додати ваш коментар.
Олів'є Дулак
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.