4

Большинство советов для Mac написано, если вы используете оболочку Bash. Если я переключусь на zsh, насколько несовместимым я стану с текущими сценариями Bash, которые есть в моей системе, и какие советы мне дают пользователи SU?

Есть ли #!/bin/sh в начале моих скриптов поможет?

Редактировать: не имеет отношения к вопросу, почему я хочу сделать это. Лучшее завершение табуляции. Я только что попробовал zsh, вставив скрипт входа в систему, как это было предложено здесь, и я просто поражен.

5 ответов5

4

Строка shebang, которую вы показываете, означает запуск сценария с использованием оболочки Bourne (или другой оболочки в режиме совместимости). Эти сценарии, вероятно, будут продолжать работать с той же оболочкой, что и сейчас, если вы переключитесь на zsh в качестве интерактивной оболочки. Единственный способ, который изменится, это если вы связываете sh с zsh , но это не должно изменять функциональность.

Вы обнаружите определенную совместимость между zsh и Bash, когда будете использовать ее как оболочку для входа в систему или при написании сценариев, специально призывающих к тому или иному с использованием строк shebang, таких как:

#!/usr/bin/bash

или же

#!/usr/bin/zsh

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

Вы обнаружите, что для написания сценариев любая оболочка значительно более мощная, чем оболочка Bourne (sh), но за счет переносимости. Кроме того, поскольку Bash более широко используется, чем zsh, его сценарии относительно более переносимы.

4

Я не пользователь zsh, но из того, что я читал в SuperUser и других местах, у меня всегда складывалось впечатление, что его поклонники больше внимания уделяют его дополнительным функциям для интерактивного использования, чем для сценариев. Первое предложение описания zsh на сайте ZSH повторяет этот акцент на интерактивных функциях: «Zsh - это оболочка, предназначенная для интерактивного использования, хотя она также является мощным языком сценариев».

Тем не менее, если вы планируете переключить свою оболочку входа в систему, вы можете продолжать писать свои скрипты на bash. Как указал другой ответ, bash-скрипты будут более переносимыми.

Существующие скрипты с явным #!/bin/sh (или #!/bin/bash или любой другой путь) будет работать нормально независимо от вашей оболочки входа в систему.

3

Здесь вы найдете список « bashisms », то есть фрагментов кода, которые будут выполняться в оболочке bash, но не в других оболочках, совместимых с bourne.

Если вы хотите добиться максимальной переносимости при написании сценариев оболочки, начните сценарий с #!/bin/sh и избегайте "bashisms", чтобы он работал в любой другой posix-совместимой оболочке, например, ksh или zsh.

1

/bin/sh указывает на bash, запустив его в режиме совместимости. Изменения в вашей оболочке входа в систему - это только то, какие встроенные модули доступны и как они работают. Скрипты следуют своей линии Шебанга.

1

Под «переключением на zsh» я предполагаю, что вы имеете в виду одну из двух вещей:

  • вы будете использовать chsh (или эквивалент), чтобы изменить оболочку входа в систему на zsh, или
  • вы настроите Терминал (или его эквивалент) для использования zsh в качестве оболочки по умолчанию.

Большинство программ оболочки («скрипты») содержат строку «shebang» /«hash-bang» . Шебанг объявляет, какой интерпретатор (оболочка) должен интерпретировать (запустить) программу, которая следует за ним.

Как указывают несколько других ответов, программы оболочки, использующие строку shebang, не будут затронуты выбором пользователем оболочки входа в систему, а также интерактивной оболочкой, которая является родителем или N-ным родителем запущенной программы оболочки.

Если вы устанавливаете новую версию zsh и включаете ее в PATH, программы, использующие шебанг, такие как #!/usr/bin/env zsh будет использовать эту новую версию (когда они запускаются с переменной PATH, которая ставит новую zsh первой). Это может вызвать проблемы только в том случае, если между старой / исходной версией zsh и новой версией было сделано несовместимое изменение. Обратите внимание, что это будет проблема внутри- zsh (inter- zsh- версии), а не проблема между оболочками, о которой я подозреваю, что вы обеспокоены. Обычно это гораздо меньшая категория ошибок, чем если бы (например) вы пытались запустить запущенную программу bash с помощью ksh.

Отказ от использования линии Шебанга по своей сути не переносим между пользовательскими средами. Результат попытки запуска исполняемого недвоичного файла †, в котором отсутствует шебанг, зависит от среды (ОС, оболочка, возможно, оболочка входа в систему и переменные среды). Когда такой файл запускается в моей системе Mac OS X 10.4, поведение меняется в зависимости от оболочки, которая его запускает. ksh и bash оба интерпретируют файл как раздвоенную копию себя. Zsh всегда передает его в /bin/sh . Если какая - то программа должны были попытаться exec его непосредственно, оно не будет с ENOEXEC (это происходит внутри оболочки, они просто «обложка для нее» на «работает» она в альтернативном пути). У меня есть смутная память о некоторых древних системах, которые даже пытались использовать оболочку входа пользователя в этой ситуации, но мой быстрый поиск ничего полезного не дал.

Недвоичный файл - это файл, который ядро не распознает как один из поддерживаемых форматов двоичных объектов.


Что касается интерактивной совместимости, zsh поддерживает большую часть расширенного синтаксиса от bash и ksh (хотя некоторые из них должны быть включены с помощью параметров оболочки), поэтому большая часть рекомендаций «shell», которые вы найдете в Super User, будет прекрасно работать в Zsh (даже если некоторые из них состоят из "bashisms"). Некоторые вещи (привязки редактирования командной строки, завершение , отображение подсказок и т.д.) Полностью отличаются от bash и ksh и потребуют другого синтаксиса для аналогичных операций.

У zsh есть немного совместимости с bash , но я никогда не пробовал.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .