2008-09-16 5 views
51

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

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

ответ

41

Bash.

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

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

0

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

Я, к сожалению, не могу реально решить проблемы с программированием.

+1

Если вы планируете распространять скрипты, используйте posix-sh. Bash - хорошая оболочка, а по умолчанию - Linux. Старые ароматы Unix имеют тенденцию иметь sh, ksh и csh. В производственной среде может быть трудно получить разрешение или прощение для установки оболочки по вашему выбору на всех системах. – 2009-07-07 15:25:47

+2

Он не установлен по умолчанию на AIX, который мы используем на работе (крупная финансовая организация США), и мальчик, если я хочу. – 2011-07-05 18:14:13

2

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

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

+3

ksh имеет завершение, только не с помощью клавиши табуляции. – user13158 2008-09-16 17:37:22

+2

`ksh --version`:« версия sh (AT & T Research) 93t + 2009-05-01 »имеет завершение табуляции и Esc-завершение. – 2010-02-23 01:40:04

+2

По умолчанию ksh использует как их завершение на случай, если кому-то было любопытно. Источник: http://kornshell.com/doc/faq.html – Katerberg 2011-01-07 18:57:01

3

@foxxtrot

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

+0

Обратите внимание, что bash имеет другое поведение, если/bin/sh is (sym) связано с bash: если bash вызывается с именем sh, он пытается имитировать запуск поведение исторических версий sh максимально близко, а , соответствующее стандарту POSIX. – 2011-04-02 22:51:32

+3

В Debian стандартная `/ bin/sh` на самом деле` dash`, оболочка debian almquist. Это приводит к тому, что многие «избыточные» команды bash отвергаются «#!/Bin/sh` – thom 2013-11-23 00:46:58

3

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

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

3

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

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

Узнайте, как использовать завершение и историю вашей оболочки; иногда читайте manpage и пытайтесь узнать несколько новых вещей.

+0

. На момент написания этого ответа у ksh93, возможно, было больше колоколов и свистов с точки зрения программирования (ассоциативные массивы и имена сначала на ум), хотя это изменилось за прошедшие восемь лет. Он по-прежнему имеет математику с плавающей запятой, которой не хватает. – 2016-09-18 06:06:59

4

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

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

+0

HP-UX предоставляет sh, csh и ksh в качестве стандартных оболочек. В 11.31 bash был включен на установочный носитель по умолчанию. Но, учитывая, что в мире все еще работает 10,20, ksh по-прежнему является лучшей ставкой для администрирования HP-UX. – 2009-07-07 15:27:14

+0

Вы можете использовать завершение vi в bash с помощью `set -o vi` и добавить его в файл` ~/.bashrc`, чтобы сделать его постоянным. Вот как у меня есть мой набор. – Wildcard 2015-10-16 07:19:52

-2

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

4

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

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

25

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

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

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

Я пошел от ksh88 на SVR2 до tcsh, до ksh88sun и ksh93. Я попробовал bash, и ненавидел его, потому что он сплющил мою историю. Затем я обнаружил

shopt -s lithist 

и все было хорошо. (Вариант литирования гарантирует, что символы новой строки сохранены в вашей команде .)

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

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

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

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

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

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

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

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

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

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

108

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

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

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

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

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

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

3

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

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

Смежные вопросы