Каковы принципиальные различия между основными * оболочками NIX? [закрыто]


52

Каковы принципиальные различия между основными оболочками * NIX и какими сценариями может быть предложено использовать один поверх другого? Я понимаю, что некоторые из них, вероятно, сводятся к пользовательским предпочтениям, но я когда-либо использовал только bash, и мне интересно узнать, где может быть полезна другая оболочка.

Кроме того, влияет ли это на написанные пользователем сценарии оболочки при запуске под одной или другой оболочкой, или это просто вопрос изменения оболочки вверху файла? Мой инстинкт говорит, что это не так просто.

Ответы:


52

Для интерактивного использования есть два основных соперника, bash и zsh , плюс stggler tcsh и новичок fish .

  • Bash является официальной оболочкой проекта GNU и оболочкой по умолчанию в большинстве дистрибутивов Linux. На других устройствах, которые не поставляются с приличной интерактивной оболочкой как часть базовой установки, я думаю, что bash - это то, что люди склонны выбирать, в цикле самоусиления «bash есть везде, поэтому я тоже буду его использовать». Смотрите также Почему Bash везде? (с большим количеством исторической информации).

  • Zsh имеет почти все функции bash и многие другие (полезные!) Функции. Его основным недостатком является то, что он менее известен, что с практической точки зрения означает, что вы с меньшей вероятностью обнаружите, что он уже установлен в системе, которую установил кто-то другой, и о нем меньше сторонней документации. Смотрите также Какие функции zsh вы используете? , Какие функции в Zsh и отсутствует Баш, или наоборот? ,

  • Когда-то (до начала 1990-х) Tcsh была оболочкой с лучшими интерактивными функциями, такими как его предшественник csh. Это сделало его популярным для интерактивного использования (но не для сценариев ). Zsh догнал tcsh и довольно быстро улучшился, а bash догнал (с программируемым завершением) в начале 2000-х, в то время как tcsh едва добился какого-либо прогресса за последние 15 лет. Поэтому есть мало причин изучать tcsh сейчас.

  • Рыба старается быть чище, чем ее предшественники. У него есть некоторые полезные функции (более простой синтаксис, цветовая подсветка синтаксиса в командной строке), но отсутствуют другие (что не нравится автору). Сообщество рыб намного меньше, чем даже Zsh, что делает последствия еще более острыми.


Для сценариев есть несколько языков, на которые вы можете ориентироваться, в зависимости от того, насколько переносимыми должны быть ваши сценарии.

  • Все, что притворяется Unix-подобным, имеет оболочку, созданную Bourne как /bin/sh. Есть еще несколько коммерческих отделений /bin/sh, которые не совместимы с POSIX .

  • Почти каждый работающий в настоящее время Unix имеет shисполняемый файл, который по крайней мере совместим по крайней мере с POSIX.2-1992 и обычно по крайней мере с POSIX: 2001, он же Single Unix v3 . Эта оболочка может находиться в другом каталоге, например /usr/bin/posixили /usr/xpg6/bin. Уровни эмуляции POSIX также существуют практически для каждой системы, достаточно мощной для ее поддержки, что делает ее привлекательной целью.

  • Многие системы UNIX имеют ksh93 , который приносит некоторые очень полезные функции , которые POSIX ш испытывает недостаток (массивы, ассоциативные массивы, расширенные шарики ( *(foo), @(foo|bar), ...), нулевой шарики ( ~(N)foo*), ...). Изначально Ksh был коммерческим программным обеспечением (оно стало бесплатным в 2000 году, после того как установились некоторые привычки), и многие бесплатные объединения (Linux, * BSD) привыкли предоставлять только гораздо более старый бесплатный клон ( pdksh ), в котором отсутствуют многие из этих полезных функций. , Теперь pdksh вытесняется mksh за пределы OpenBSD, но даже mksh не в состоянии реализовать все функции ksh93. Сегодня вы не можете рассчитывать на то, что ksh93 будет доступен везде, особенно в Linux, где bash является нормой.

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

  • Zsh имеет большинство полезных функций ksh93 и bash. Его основной синтаксис чище, но несовместим с Bourne. За исключением macOS, не рассчитывайте, что zsh будет доступен в системе, которую вы не устанавливали.

  • Для более сложных сценариев вы можете обратиться к Perl или Python . Эти языки имеют надлежащие структуры данных, приличные функции манипулирования текстом, приличную комбинацию процессов и механизмы связи, а также множество доступных библиотек. У большинства систем Unix они есть, либо в комплекте с ОС, либо устанавливаемые администратором (поскольку существует так много сценариев Perl и Python, что это редкая система, в которой нет хотя бы одного из них).


4
Для сценариев я нацеливаюсь на dash (если только мне не нужны расширенные функции bash), который имеет минимальный набор функций и является жалобой posix для максимальной совместимости. (и это маленький легкий и быстрый)
Хильдред

Отличная документация! Две заметки. Во-первых, Solaris является одним из тех «коммерческих объединений, где / bin / sh не совместим с POSIX». В частности, он использует jsh(который не является Java-оболочкой!), В котором отсутствует подстановка переменных, как ${VAR#foo}и ${VAR%bar}.
Адам Кац

Во- вторых, tcshявляется довольно популярным среди пользователей UNIX , которые изучили свои трюки до ~ середины 90-х годов (которые видели введение как bashи zsh), особенно среди старых UNIX + Cразработчиков, которые начали жизнь с csh(Напомним, что в с в cshстендами для Cязыка , который был вдохновением для его отличий от раковин в стиле Борна). См. Также программирование на Csh , которое считается вредным , и которое я часто использую для советов по глубокой магии POSIX (в дополнение к аргументам анти-csh).
Адам Кац

Mac OS X никогда не является "OS / X". (: А как zsh несовместим с Борном? (Ну, кроме таких вещей, как не разделение слов на переменные.)
SilverWolf - Восстановить Монику

@seaturtle Основным отличием является не разделение слов на переменные, которое сломает многие сценарии sh, если вы попытаетесь запустить их с zsh (если вы не запустите zsh в режиме эмуляции sh / ksh).
Жиль "ТАК - перестань быть злым"

27

Существует два основных вида shell: sh (например, bash) и csh (например, tcsh). Для интерактивного использования это в основном сводится к тому, к чему вы привыкли. Я использовал csh, а затем tcsh годами, и переключаться было бы больно, просто потому, что я к этому привык. Я также использовал bash и не думаю, что есть веские причины для перехода. За исключением, может быть, если один или другой недоступен на машинах, которые вы регулярно используете.

Для программирования синтаксис другой. Вы не можете просто изменить оболочку, но также необходимо изменить синтаксис сценария. Для сценариев вы хотите использовать sh или bash. Синтаксис гораздо более поддается сценариям, как объяснено здесь (спасибо Риккардо Мурри за ссылку. Это хорошее руководство по сценариям bash.

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


12

В старые времена, когда AT & T изобрел UNIX, существовал Bourne Shell, написанный Стивом Борном. Это было довольно просто, и не хватало многих инструментов, которые мы считаем само собой разумеющимся в наши дни.

AT & T на самом деле не был в бизнесе UNIX, поэтому в настоящее время Berkelely в некотором роде принял базовую ОС, и они внесли некоторые изменения в BSD UNIX. Среди многих изменений была новая оболочка под названием csh, в которой было много улучшений по сравнению с sh, в том числе контроль работы, улучшенное интерактивное использование и так далее. К сожалению, они решили, что синтаксис программирования sh не работает, и создали свои собственные (несколько плохие), скопированные из стилей программирования C. (Классическая напыщенная речь http://www.faqs.org/faqs/unix-faq/shell/csh-whynot/ ) Так что теперь было два синтаксиса.

Позже они внесли улучшения в CSH, добавив завершение табуляции и некоторые другие вещи. Это стало tcsh, и если вы используете CSH, это, вероятно, тот, который вы используете.

AT & T решили, что это не совсем не связано с бизнесом UNIX, и они тоже оттачивали его. Дэвид Корн (хороший парень) создал оболочку Корн. Основанная на идее расширения синтаксиса оболочки Bourne, она добавила много вещей как для программистов, так и для интерактивного использования. На самом деле существует несколько версий, и вы можете редко видеть такие вещи, как ksh88 и ksh93, обозначающие варианты.

Затем пришли ФСФ и ОС GNU. Они хотели создать свою собственную UNIX-совместимую ОС под названием Hurd и хотели лучшую оболочку для нее. Они назвали Bash для Bourne Again Sheell. Правила POSIX пришли как раз в это время, и они хотели бы сделать в POSIX оболочку. Они оглянулись, взяв синтаксис оболочки Bourne и улучшения оболочки Korn, а также украли и расширили интерактивные функции из tcsh. Он стал де-факто оболочкой для Linux, поэтому он очень распространен.

Также есть zsh, написанный как «окончательная» оболочка. Это также очень распространено в мире Linux. Это расширило bash (и немного опылило кросс, некоторые новые вещи вернулись к bash).

Если бы я выбрал раковину, я бы выбрал bash или zsh. Bash, возможно, в нескольких местах, чем Zsh. zsh более мощный, но bash для меня хорош. Real / bin / sh Bourne shell существует только по историческим причинам. В bash есть все, что может предложить ksh, и даже больше. Синтаксис чище, чем csh или tcsh, и обладает лучшими возможностями, чем любой из них.

Конвертировать скрипт зависит от того, к чему. Стиль оболочки Bourne (sh, ksh, bash, zsh) в или из стиля csh (csh, tcsh) будет сложным. Переход от старого к новому (/ bin / sh => bash, / bin / ksh => zsh) будет проще, чем другим способом.


Обратите внимание, что страница csh-whynot была написана еще в сентябре 1995 года (проверьте тег версии вверху). Я не знаю, но я ожидаю, что многое изменилось за 18 лет с тех пор.
CVn

8

Две основные ветви оболочек - это производные оболочки Борна (sh, bash, ksh, ash, yash и zsh) и производные csh (tcsh и ... uhm ... tcsh).

Я подозреваю (хотя у меня нет фактических чисел), что bash является наиболее широко используемым, по-видимому, это оболочка по умолчанию в большинстве linux.

Большинство вещей, написанных в одной производной оболочки Bourne, вероятно, будут работать в других. Большинство вещей, написанных в оболочке Bourne, вероятно, нужно будет модифицировать для запуска под csh или tcsh.

Лично я использовал ksh, когда начинал, потому что это то, что было в системе, которую я использовал. Сейчас я в основном использую bash.


1
рыба - это раковина, вдохновленная csh
hildred

1

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.