Вопрос

Я не новичок в *nix, однако в последнее время провожу много времени в командной строке.Мой вопрос: каковы преимущества использования KornShell (ksh) или Bash Shell?В чем подводные камни использования одного над другим?

Стремление понять с точки зрения пользователя, а не просто скриптинга.

Это было полезно?

Решение

Баш.

Различные реализации UNIX и Linux имеют различные реализации ksh на уровне исходного кода, некоторые из которых являются настоящими ksh, некоторые из них являются реализациями pdksh, а некоторые являются просто символическими ссылками на какую-то другую оболочку, имеющую индивидуальность «ksh».Это может привести к странным различиям в поведении выполнения.

По крайней мере, с bash вы можете быть уверены, что это единая база кода, и все, о чем вам нужно беспокоиться, это какая (обычно минимальная) версия bash установлена.По моему опыту, поскольку я написал много сценариев практически для всех современных (и не очень современных) UNIX, программирование на bash является более надежным.

Другие советы

Разница между Kornshell и Bash минимальна.У одного есть определенные преимущества перед другим, но различия незначительны:

  • BASH гораздо проще настроить подсказку, отображающую текущий каталог.Делать то же самое в Kornshell — это хакерство.
  • В Kornshell есть ассоциативные массивы, а в BASH — нет.В последний раз я использовал ассоциативные массивы...Дай мне подумать...Никогда.
  • Kornshell немного лучше обрабатывает синтаксис циклов.Обычно вы можете установить значение в цикле Kornshell и сделать его доступным после цикла.
  • Bash обрабатывает получение кодов выхода из каналов более простым способом.
  • У Корншелла есть print команда, которая намного лучше, чем echo команда.
  • В Bash есть завершение табуляции.В старых версиях
  • У Корншелла есть r команда истории, которая позволяет мне быстро перезапускать старые команды.
  • У Kornshell есть синтаксис cd old new который заменяет old с new в вашем каталоге и на компакт-дисках там.Это удобно, когда вы находитесь в каталоге под названием /foo/bar/barfoo/one/bar/bar/foo/bar и вам нужно перейти на /foo/bar/barfoo/two/bar/bar/foo/bar В Kornshell вы можете просто сделать cd one two и покончим с этим.В BASH вам придется cd ../../../../../two/bar/bar/foo/bar.

Я старый парень из Kornshell, потому что я изучал Unix в 1990-х годах, и тогда я предпочитал именно эту оболочку.Я могу использовать Bash, но иногда меня это расстраивает, потому что по привычке я использую некоторые незначительные функции Kornshell, которых нет в BASH, и они не работают.Поэтому, когда это возможно, я устанавливаю Kornshell по умолчанию.

Однако я собираюсь посоветовать вам изучить BASH.Bash теперь реализован в большинстве систем Unix, а также в Linux, и ресурсов для изучения BASH и получения помощи просто больше, чем в Kornshell.Если вам нужно сделать что-то экзотическое в BASH, вы можете зайти на Stackoverflow, опубликовать свой вопрос и через несколько минут получить дюжину ответов — и некоторые из них даже будут правильными!

Если у вас есть вопрос о Kornshell и вы публикуете его на Stackoverflow, вам придется подождать, пока какой-нибудь старый хакер прошлого, такой как я, проснется от сна, прежде чем вы получите ответ.И забудьте о каком-либо ответе, если в тот день в доме престарелых подают пудинг.

BASH сейчас является просто предпочтительной оболочкой, поэтому, если вам нужно чему-то научиться, лучше использовать то, что популярно.

Я ветеран кукурузной оболочки, так что знайте, что я говорю с этой точки зрения.

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

Для интерактивного использования возьмите все, что соответствует вашим потребностям.Экспериментируйте.Мне нравится использовать одну и ту же оболочку для интерактивного использования и программирования.

Я перешел с ksh88 на SVR2 на tcsh, на ksh88sun (который добавил значительную поддержку интернационализации) и ksh93.Я попробовал Bash и ненавидел его, потому что это сгладило мою историю.Потом я обнаружил shopt -s lithist и все было хорошо.( lithist Опция гарантирует, что новеньши сохраняются в истории вашей команды.)

Для программирования оболочки я бы серьезно рекомендовал ksh93, если вам нужен согласованный язык программирования, хорошая совместимость с POSIX и хорошая производительность, поскольку многие распространенные команды Unix могут быть доступны как встроенные функции.

Если вам нужна переносимость, используйте хотя бы оба.И убедитесь, что у вас есть хороший набор тестов.

Между оболочками есть много тонких различий.Рассмотрим, например, чтение из канала:

b=42 && echo one two three four |
    read a b junk && echo $b

Это даст разные результаты в разных оболочках.Корн-оболочка прокладывает трубопроводы сзади вперед;последний элемент в конвейере выполняется в текущем процессе.Bash не поддерживал это полезное поведение до версии 4.x, и даже тогда оно не использовалось по умолчанию.

Еще один пример, иллюстрирующий последовательность:А echo сама команда, которая устарела из-за разделения между BSD и SYSV unix, и каждая из них ввела свое собственное соглашение об отказе от вывода новых строк (и другого поведения).Результат этого до сих пор можно увидеть во многих сценариях настройки.

Кш подошел к этому радикально и представил print команда, которая фактически поддерживает оба метода (теперь -n вариант из BSD, и завершающий \c специальный символ из SYSV)

Однако для серьезного системного программирования я бы порекомендовал что-то другое, кроме оболочки, например Python, Perl.Или сделайте еще один шаг и используйте такую ​​платформу, как puppet, которая позволяет вам наблюдать и корректировать состояние целых кластеров систем с хорошим аудитом.

Программирование оболочки похоже на плавание в неизведанных водах или даже хуже.

Программирование на любом языке требует знания его синтаксиса, интерфейсов и поведения.Программирование оболочки ничем не отличается.

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

Вот краткое введение: http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/

Это своего рода битва Unix против Linux.В большинстве, если не во всех, дистрибутивах Linux установлен bash и необязателен ksh.Большинство систем Unix, таких как Solaris, AIX и HPUX, имеют ksh по умолчанию.

Лично я всегда использую ksh, мне нравится завершение vi, и я практически везде использую Solaris.

Для скриптов я всегда использую кш потому что это сглаживает ошибки.

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

@foxxtrot

На самом деле стандартной оболочкой является оболочка Bourne (sh). /bin/sh в Linux на самом деле bash, но если вы стремитесь к кроссплатформенным сценариям, вам лучше придерживаться функций оригинальной оболочки Bourne или писать ее что-то вроде perl.

Мой ответ: «Выберите один и научитесь его использовать».Они оба приличные оболочки;bash, вероятно, имеет больше наворотов, но они оба имеют базовые функции, которые вам нужны.В наши дни bash более универсален.Если вы постоянно используете Linux, просто придерживайтесь его.

Если вы программируете, попытка придерживаться простого «sh» для обеспечения переносимости является хорошей практикой, но учитывая, что bash в наши дни доступен так широко, этот совет, вероятно, немного старомоден.

Узнайте, как использовать завершение и историю оболочки;время от времени читайте справочную страницу и пытайтесь узнать что-нибудь новое.

Во-первых, в bash есть завершение табуляции.Одного этого достаточно, чтобы заставить меня предпочесть его ksh.

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

Доступный в большинстве систем UNIX, ksh соответствует стандартам, четко спроектирован и хорошо продуман.Я думаю, что книг, помогающих в КШ, достаточно и все понятно, особенно книга О'Рейли.Баш — это масса.Я храню его только как оболочку входа в систему root для Linux дома.

Для интерактивного использования я предпочитаю zsh в Linux/UNIX.Я запускаю сценарии в zsh, но большинство своих сценариев я тестирую, хотя функции работают в AIX ksh.

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

К сожалению, я не могу описать фактические различия в программировании между оболочками.

Баш является стандартом для Linux.
Мой опыт показывает, что легче найти помощь по bash, чем по ksh или csh.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top