Вопрос Что находится под угрозой с переходом на ZSH?


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

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

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


4
2018-05-16 23:42


происхождения




ответы:


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

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

#!/usr/bin/bash

или

#!/usr/bin/zsh

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

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


4
2018-05-16 23:58



Спасибо за это. Вы говорите: «любая оболочка значительно мощнее, чем оболочка Борна». Ты имеешь в виду bashили zsh как вы показываете в строке shebang? - Dan Rosenstark
@Yar: Да, и Bash, и zsh (и даже оболочка Korn, особенно ksh93) имеют больше возможностей, чем sh, - Dennis Williamson
Хорошо, поэтому почти все сценарии оболочки написаны для режима совместимости. Не имел представления. Между тем моя линия shebang говорит #!/usr/bin/env ruby большую часть времени, но я использую много других людей. sh скрипты. - Dan Rosenstark


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

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

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


4
2018-05-17 03:04



Когда я пишу сценарии самостоятельно, я использую Ruby :) хороший ответ, спасибо! - Dan Rosenstark
использование zsh невероятно удобно. Скрипты, совсем нет. btw, zsh действует по-разному в зависимости от того, как вы его называете, т. е. если / bin / sh является символической ссылкой на / bin / zsh, тогда zsh будет действовать больше как / bin / sh - chiggsy


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

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


3
2018-05-17 04:48



Спасибо, хорошая информация при добавлении к другим ответам. - Dan Rosenstark


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


1
2018-05-16 23:54



Следует отметить, что это верно для некоторых систем. На других это связано с dashили ash или другие, или это даже на самом деле реальная оболочка Борна. - Dennis Williamson
Ага. Но вопрос помечен как «osx». - Ignacio Vazquez-Abrams
К сожалению, «отмечено» слишком мало, чтобы быть комментарием к SU. - Dan Rosenstark


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

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

Большинство программ оболочки («скрипты» оболочки) будут включать «Притон» / «хэш-бах» линия. Shebang объявляет, какой интерпретатор (оболочка) должен интерпретировать (запускать) программу, которая следует за ним.

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

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

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

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


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

  ЗШ имеет немного удар совместимость с завершением, но я никогда не пробовал.


1
2018-05-17 09:00



Все еще обрабатываю это. +1 на данный момент :) - Dan Rosenstark
Он работает лучше (zsh's bash completeter), чем bash. - chiggsy