Яка оболонка виконує сценарії, коли на початку немає рядка shebang (#! / Path / to / shell)? Я припускаю / bin / sh, але не можу підтвердити.
Ядро відмовляється виконувати такі сценарії і повертає ENOEXEC, тому точна поведінка залежить від програми запуску такого сценарію з .
- bash 4.2.39 - використовує себе
- busybox-ash 1.20.2 - використовує себе
- тире 0,5,7 - пробіг / бін / ш
- 1.23.1 риба - скаржиться на ENOEXEC, потім звинувачує неправильний файл
- AT&T ksh 93u + 2012.08.01 - використовує себе
- mksh R40f - працює / бін / ш
- pdksh 5.2.14 - пробіг / бін / ш
- sh-heirloom 050706 - використовує себе
- tcsh 6.18.01 - пробіг / бін / ш
- zsh 5.0.0 - працює / бін / ш
- cmd.exe 5.1.2600 - виглядає на вас смішно.
У glibc функціонує execv()
або execve()
просто повертає ENOEXEC. Але execvp()
приховує цей код помилки і автоматично викликає / bin / sh. (Це зафіксовано у виконанні (3p) .)
Що вважається "найкращою практикою" щодо написання скриптів оболонок, які працюватимуть на будь-якій платформі? (гаразд, це щось із відкритих)
Або дотримуйтесь sh
лише функцій, визначених POSIX, або просто пройдіть повний баш (який широко доступний) і згадайте про це у своїх вимогах, якщо розповсюджуєте його.
(Тепер, коли я думаю про це, Perl - чи, можливо, Python - був би ще більш портативним, не кажучи вже про кращий синтаксис.)
Завжди додайте рядок shebang. Якщо ви використовуєте bash або zsh, використовуйте #!/usr/bin/env bash
замість жорсткого кодування шлях оболонки. (Однак оболонка POSIX гарантовано є /bin/sh
, тому пропустіть env
у цьому випадку.)
(На жаль, навіть /bin/sh
це не завжди однаково. Програма autoconf GNU має мати справу з багатьма різними химерностями .)
Чи можливо написати сценарій, який намагається використовувати zsh і повертається назад до bash, якщо zsh недоступний? Я намагався поставити два рядки shebang, як нижче, але це просто помилки з поганим інтерпретатором: / bin / zsh: немає такого файлу чи каталогу , якщо я спробую його на машині без zsh.
Може бути лише одна лінія шебанга; все після символу нового рядка навіть не читається ядром, а трактується як коментар оболонок.
Це можна написати скрипт , який працює , як #!/bin/sh
, перевірки яких оболонка є, і працює exec zsh "$0" "$@"
або в exec bash "$0" "$@"
залежності від результату. Однак синтаксис, що використовується bash та zsh, настільки різний у різних місцях, що я б не рекомендував робити це для вашого власного розуму.