Есть ли какая-нибудь причина иметь shebang, указывающий на /bin/sh, а не на /bin/bash?

Вы забыли настроить блок журнала ... {{ 1}} например:

log { source(s_net); destination(d_cons); };
54
22.12.2015, 15:45
2 ответа

Единственная оставшаяся причина написать сценарий оболочки вместо сценария на более мощном и эргономичном языке, если переносимость на устаревшие системы с неизвестный набор установленного программного обеспечения важнее любого другого фактора .

/ bin / sh - единственный интерпретатор скриптов, доступный для всего, что называет себя Unix. Но в очень большом количестве устаревших систем / bin / sh и связанные с ними утилиты даже не соответствуют спецификации «оболочки и утилит» POSIX.1-1996, не говоря уже о чем-либо более современном. Стандартные инструменты являются необязательным дополнением, устанавливаемым в / usr / xpg4 или в другом таком неочевидном месте. 1 Создание сценариев для языка оболочки переносимого подмножества еще более утомительно и подвержено ошибкам, чем создание сценариев для языка оболочки POSIX. (Прочтите созданный Autoconf сценарий configure когда-нибудь, если вы мне не верите. Одной настройки должно быть достаточно, чтобы убедить вас.)

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

Следовательно, вы не должны никогда писать #! / bin / bash , потому что, если это вариант, лучший язык также является вариантом.

1 Например, Solaris 10 и более ранние версии поставляли исходную оболочку Борна как / bin / sh . Мне сообщили, что Solaris 11 обновил его до ksh93.

4
27.01.2020, 19:33

Другие указали, что предпосылки вопроса о том, что оболочка Bourne Again используется по умолчанию и повсеместно используется, совершенно неверны.

В дополнение к этому, действительно есть веские причины для использования чего-то другого, кроме оболочки Bourne Again, для интерпретации сценариев оболочки. Эти причины побудили в течение ряда лет большой проект Ubuntu и Debian удалить bashisms и сделать так, чтобы как можно больше сценариев оболочки запускалось при инициализации системы (это было много сценариев оболочки с Системой 5 . ] rc ) и установка / удаление пакетов используют оболочку Debian Almquist вместо оболочки Bourne Again.

Проще говоря: оболочка Bourne Again, набитая интерактивными функциями, не является самым быстрым интерпретатором оболочки для POSIX-совместимого сценария оболочки. Так что, если можно сделать свои сценарии оболочки POSIX-совместимыми, интерпретируя их с помощью более легкой программы, такой как оболочка Debian Almquist, его система будет работать лучше. (В конце концов, Debian пришлось внести небольшие изменения в оболочку Almquist, чтобы добавить поддержку пары не-POSIX конструкций оболочки, которые были просто слишком глубоко и широко внедрены и слишком полезны, чтобы от них избавиться.)

Результат из всего этого был большой выигрыш в производительности начальной загрузки.

Итак, здесь необходимо рассмотреть два различных класса оболочек:

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

Обратите внимание, что выражение «предпочтение / bin / sh » является чрезмерным упрощением. У Debian на самом деле было как минимум две цели:

  1. Перед администраторами, использующими оболочку Debian Almquist, Z Shell (в режиме POSIX), оболочку Bourne Again (в режиме POSIX), MirBSD Korn shell и другие, такие как / bin / sh , либо…

    1. … делали скрипты максимально переносимыми, так что переключение того, что / bin / sh было сопоставлено с didn ' т ломать вещи; или

    2. … создание непереносимых сценариев явно нацелено на правильную программу интерпретатора , вместо того, чтобы просто ожидать, что / bin / sh будет отображаться на нее.

  2. Оболочка Debian Almquist была сделана отображением по умолчанию для / bin / sh вместо Bourne Shell, так что те сценарии, которые были POSIX-совместимыми (или, точнее , Соответствует Руководству по политике Debian) выполнялась быстрее.

И, конечно, как только человек попадает в это, он может пойти намного дальше; например, рассмотрение компромиссов эффективности подобных / bin / true и / usr / bin / clear сценариев оболочки или скомпилированных программ. Но, к счастью, это выходит за рамки этого ответа. ☺

Все это, конечно, не ново и даже не специфично для Unix.Еще на рубеже веков я написал и опубликовал интерпретатор командной строки, который имел как «интерактивную», так и «неинтерактивную» разновидности, объясняя это самое разделение в своей документации и отмечая разницу между COMSPEC и переменные среды OS2_SHELL . Точно так же обсуждение удаления башизмов в Debian System V rc и сценарии установки / удаления пакетов восходит к 1990-м годам.

Дополнительная литература

21
27.01.2020, 19:33

Теги

Похожие вопросы