Bash или KornShell (кш)?

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

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


person user13158    schedule 16.09.2008    source источник


Ответы (12)


Баш.

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

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

person j.e.hahn    schedule 16.09.2008
comment
Если вы делаете только минимальный общий знаменатель ksh, я бы согласился. Подлинный David Korn ksh93, с другой стороны, имеет неоспоримые преимущества для сценариев: скорость, которая приближает его к awk для обработки текста; встроенная математика с плавающей запятой; namevars и ассоциативные массивы даже в системах, не использующих последнюю версию; и т. д. - person Charles Duffy; 18.09.2016

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

  • BASH гораздо проще установить подсказку, отображающую текущий каталог. Делать то же самое в Kornshell хакерски.
  • В Kornshell есть ассоциативные массивы, а в BASH — нет. Последний раз, когда я использовал ассоциативные массивы, был... Дайте подумать... Никогда.
  • Корншелл немного лучше обрабатывает синтаксис циклов. Обычно вы можете установить значение в цикле Kornshell и сделать его доступным после цикла.
  • Bash обрабатывает получение кодов выхода из каналов более чистым способом.
  • В Kornshell есть команда print, которая намного лучше, чем команда echo.
  • Bash имеет автозавершение с помощью табуляции. В старых версиях
  • В Kornshell есть команда r history, которая позволяет мне быстро повторно запускать старые команды.
  • В 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 сейчас является просто предпочтительной оболочкой, поэтому, если вам нужно чему-то научиться, можете также использовать то, что популярно.

person David W.    schedule 08.08.2011
comment
Для полноты картины bash версии 4 поддерживает ассоциативные массивы. Я никогда не использовал AA ни в одной из оболочек, поэтому не могу сказать, работают ли они лучше, так же хорошо или хуже, чем реализация Kornshell. - person chepner; 03.02.2012
comment
Обычно вы можете установить значение в цикле Kornshell и сделать его доступным после цикла. -- я нахожу это чертовски запутанным. я, безусловно, поддерживаю то, что переменная должна иметь область видимости только в пределах своего уровня вложенности, а не за его пределами. - person amphibient; 22.02.2013
comment
Это связано с передачей команды в while readloop. У Kornshell нет проблем с доступом к переменной вне цикла. Однако для BASH этот канал является дочерним процессом, и вы теряете значение после завершения цикла. Есть способы обойти это. - person David W.; 23.02.2013
comment
Кроме того, bash реализует cd old new как ^old^new и может делать это не только в каталогах/ - person Dmytro Sirenko; 16.07.2013
comment
@EarlGray Это не работает, если предыдущая команда не была моим каталогом изменений. Кто-то еще указал, что я могу сделать это $ cd ${PWD/foo/bar}, но это немного долго для ввода. - person David W.; 16.07.2013
comment
В Bash вы можете повторно запустить команды истории, введя !N, где N — номер строки. - person Dave; 22.07.2013
comment
@Dave Это не так удобно, как r vi, где будет выполняться моя последняя команда VI. Обычно я не знаю номер строки истории, и я обычно устанавливаю extglob (функция, которая включена по умолчанию в Ksh и от которой я сильно завишу), что убивает использование ! в истории команд. - person David W.; 22.07.2013
comment
Просто хочу добавить, что все Корншеллизмы, которые я упомянул, приятно иметь функции, от которых я стал зависеть. Если бы я выучил shell сегодня, это был бы BASH, и я бы не понял всего нытья старожилов Kornshell, рассказывающих о той или иной функции и о том, насколько лучше был Интернет в старые времена. Это все равно, что слушать, как твой дедушка ноет о том, насколько лучше было, когда он был ребенком. Если подумать, это твой дедушка ноет о том, насколько лучше было, когда он был ребенком. (В моем детстве было всего три телеканала, и нам это нравилось!) - person David W.; 22.07.2013
comment
^Rvi (без пробела) перезапускает vim. Вим?! Используйте :color desert в .vimrc, когда у вас есть :syntax on. - person Walter A; 16.02.2015
comment
В bash !vi запустит последнюю команду запуска, начинающуюся с букв «vi». Если вы не уверены, что это была именно та команда, которую вы хотите, используйте !vi:p, которая напечатает команду и добавит ее в ваш список истории заново, но не запустит ее на самом деле. Затем, если это это то, что вам нужно, просто нажмите стрелку вверх и введите или просто !!, чтобы запустить его. См. man bash и найдите HISTORY EXPANSION. - person Wildcard; 16.10.2015
comment
Я также думаю, что при изучении bash важно очень четко отслеживать, какие параметры специфичны для bash, а какие совместимы с POSIX, и стараться сделать подходы, совместимые с POSIX, вашей привычкой. Если вы используете только функции bash, вы должны знать, что используете их. Держать их мысленно отдельными с самого начала — очень хорошая идея. - person Wildcard; 16.10.2015
comment
Многое из этого устарело. В bash ассоциативные массивы есть с версии 4.0 (и они чрезвычайно полезны — не могли бы вы попробовать программировать на Python без словарей?), а переменные имен — с версии 4.3. С другой стороны, подлинный David Korn ksh93 по-прежнему имеет огромное преимущество в производительности — вещи, которые нужно использовать awk для чисто соображений производительности в bash (подумайте о текстовых преобразованиях или анализе многогигабайтного файла). stream) можно сделать в ksh93 нативно с сопоставимой скоростью. - person Charles Duffy; 18.09.2016
comment
О, и ksh93 имеет математику с плавающей запятой, которой до сих пор не хватает в bash. - person Charles Duffy; 18.09.2016
comment
Про 5-й пункт можно просто сделать alias print=echo - person Jerfov2; 25.10.2016
comment
Спасибо за этот ответ, я рассмеялся :D (и был полезен) - person niels; 07.12.2017
comment
в bash $ cd - приведет вас к вашему $OLDPWD - person Jethro Cao; 23.03.2021

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

Тем не менее, мне было комфортно с оболочкой 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 не поддерживал это полезное поведение до v4.x, и даже тогда это не было по умолчанию.

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

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

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

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

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

person Henk Langeveld    schedule 02.04.2011
comment
под интерактивным использованием вы подразумеваете ручное выполнение команд с подсказкой к подсказке, а не запуск сценариев, которые объединяют такие команды? - person amphibient; 22.02.2013
comment
@foampile Да, вот что означает интерактивное использование. - person Telemachus; 23.02.2013
comment
Re: ваша разница read в неинтерактивном режиме, который на самом деле настраивается для современного bash - см. параметр lastpipe. - person Charles Duffy; 22.09.2016
comment
@CharlesDuffy правильно, и он был доступен, когда я писал это, - однако это все еще не поведение по умолчанию - вам нужен bash 4.2 или 4.3 и lastpipe shopt. Параметры Shopt неудобны, так как их установка может вызвать синтаксические ошибки. - person Henk Langeveld; 23.09.2016

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

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

person Kristian    schedule 16.09.2008
comment
HP-UX предоставляет оболочки sh, csh и ksh по умолчанию. В 11.31 bash был включен на установочный носитель по умолчанию. Но, учитывая количество 10.20, все еще работающих в мире, ksh по-прежнему лучше подходит для администрирования HP-UX. - person Stan Graves; 07.07.2009
comment
Вы можете использовать завершение vi в bash с set -o vi и добавить его в свой файл ~/.bashrc, чтобы сделать его постоянным. Вот такой у меня набор. - person Wildcard; 16.10.2015

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

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

person Chris AtLee    schedule 16.09.2008


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

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

person Allen    schedule 16.09.2008
comment
ksh имеет завершение, но не с помощью клавиши табуляции. - person user13158; 16.09.2008
comment
ksh --version: версия sh (AT&T Research) 93t+ 2009-05-01 имеет завершение табуляции и завершение Esc. - person Dennis Williamson; 23.02.2010
comment
По умолчанию ksh использует ‹ESC›‹ESC› в качестве завершения, если кому-то интересно. Источник: kornshell.com/doc/faq.html - person Katerberg; 07.01.2011

@фоксстрот

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

person Hank Gay    schedule 16.09.2008
comment
Обратите внимание, что bash имеет другое поведение, если /bin/sh (sym)связан с bash: если bash вызывается с именем sh, он пытается максимально точно имитировать поведение при запуске исторических версий sh, при этом соответствуя POSIX. стандартный же. - person glenn jackman; 03.04.2011
comment
В Debian стандартная /bin/sh на самом деле dash, оболочка debian almquist. Это заставляет многих людей удивляться, когда их действительные команды bash отклоняются #!/bin/sh - person thom; 23.11.2013

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

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

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

person Incident    schedule 16.09.2008
comment
На момент написания этого ответа у ksh93, возможно, было больше наворотов с точки зрения программирования (в первую очередь на ум приходят ассоциативные массивы и namevars), хотя за прошедшие восемь лет это изменилось. В нем все еще есть математика с плавающей запятой, которой по-прежнему не хватает в bash. - person Charles Duffy; 18.09.2016

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

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

person MeaCulpa    schedule 02.09.2011

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

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

person foxxtrot    schedule 16.09.2008
comment
Если вы планируете распространять скрипты, используйте posix-sh. Bash — хорошая оболочка, используемая по умолчанию в Linux. Старые разновидности Unix, как правило, имеют sh, ksh и csh. В производственной среде может быть сложно получить разрешение или прощение на установку выбранной вами оболочки во всех системах. - person Stan Graves; 07.07.2009
comment
Он не установлен по умолчанию на AIX, который мы используем на работе (крупное финансовое учреждение США), и, черт возьми, я бы хотел, чтобы это было так. - person Brian Warshaw; 05.07.2011

Bash является стандартом для Linux.
По моему опыту, помощь по bash найти проще, чем по ksh или csh.

person Matthieu    schedule 16.09.2008
comment
Я бы сказал, что bash — это стандарт. ;-) - person Jon Ericson; 17.09.2008
comment
bash является стандартом только для Linux. Оригинальная оболочка Bourne (sh) является стандартом для кроссплатформенных скриптов. - person Hank Gay; 17.09.2008
comment
Posix-sh является (или, возможно, «должен быть») стандартом для межплатформенных сценариев. - person Stan Graves; 07.07.2009
comment
Исправлено: Bash является стандартом для Linux. - person Matthieu; 02.02.2011
comment
В Debian стандартный /bin/sh на самом деле тире. - person thom; 23.11.2013