bash или kornshell (кш)?

<p>я не новичок в * nix, однако в последнее время я провожу много времени в prompt. мой вопрос: в чем преимущества использования kornshell (ksh) или bash shell? где подводные камни использования одного над другим?</p><p>глядя на понимание с точки зрения пользователя, а не просто сценариев.</p>

<p>bash.</p><p>различные реализации unix и linux имеют различные реализации уровня исходного кода ksh, некоторые из которых являются настоящими ksh, некоторые из которых являются реализациями pdksh, а некоторые являются просто символическими ссылками на какую-то другую оболочку, обладающую индивидуальностью "ksh". это может привести к странным различиям в поведении при исполнении.</p><p>по крайней мере, с bash вы можете быть уверены, что это единая база кода, и все, о чем вам нужно беспокоиться, это какая (обычно минимальная) версия bash установлена. сделав много сценариев практически во всех современных (и не очень современных) unix, программирование для bash более надежно соответствует моему опыту.</p>

<p>разница между корншеллом и башом минимальна. есть определенные преимущества, которые одно имеет над другим, но различия крошечные:</p><ul> <li>bash намного проще установить подсказку, которая отображает текущий каталог. делать то же самое в kornshell - это хакерство.</li> <li>у kornshell есть ассоциативные массивы, а у bash нет. так вот, последний раз, когда я использовал ассоциативные массивы, был ... дай подумать ... никогда.</li> <li>kornshell немного лучше обрабатывает синтаксис цикла. обычно вы можете установить значение в цикле kornshell и сделать его доступным после цикла.</li> <li>bash обрабатывает коды выхода из труб более чистым способом.</li> <li>в kornshell есть команда <code>print</code>, которая намного лучше, чем команда <code>echo</code>.</li> <li>bash имеет вкладки дополнений. в старых версиях</li> <li>в kornshell есть команда истории <code>r</code>, которая позволяет мне быстро запускать старые команды.</li> <li>kornshell имеет синтаксис <code>cd old new</code>, который заменяет <code>old</code> на <code>new</code> в вашем каталоге и на компакт-дисках там. это удобно, когда вы находитесь в каталоге с именем <code>/foo/bar/barfoo/one/bar/bar/foo/bar</code>, и вам нужно перейти к <code>/foo/bar/barfoo/two/bar/bar/foo/bar</code>. в kornshell вы можете просто сделать <code>cd one two</code> и покончить с этим. в bash вам нужно будет <code>cd ../../../../../two/bar/bar/foo/bar</code>.</li> </ul><p>я старый парень из kornlshell, потому что я изучал unix в 1990-х, и тогда это был shell. я могу использовать bash, но иногда я расстраиваюсь из-за этого, потому что по привычке я использую некоторые незначительные функции, которые есть у kornshell, которых нет у bash, и они не работают. поэтому, когда это возможно, я устанавливаю kornshell в качестве настроек по умолчанию.</p><p>тем не менее, я собираюсь рассказать вам, чтобы узнать bash. bash теперь реализован в большинстве систем unix, а также в linux, и для изучения bash и получения помощи просто больше ресурсов, чем в kornshell. если вам нужно сделать что-то экзотическое в bash, вы можете перейти на stackoverflow, опубликовать свой вопрос, и через несколько минут вы получите дюжину ответов - и некоторые из них даже будут правильными !.</p><p>если у вас есть вопрос kornshell и выложите его в stackoverflow, вам придется подождать, пока какой-нибудь старый прошлый их главный хакер, как я, проснется от дремоты, прежде чем вы получите ответ. и не забудьте получить ответ, если в тот день они подают пудинг в доме престарелых.</p><p>bash - это просто предпочтительная оболочка, поэтому, если вам нужно чему-то научиться, вы можете заняться тем, что популярно.</p>

<p>я ветеран korn-shell, так что знайте, что я говорю с этой точки зрения.</p><p>тем не менее, мне было удобно с bourne shell, ksh88 и ksh93, и, насколько я знаю, какие функции поддерживаются в каких. (я должен пропустить ksh88 здесь, так как он больше не распространяется.)</p><p>для интерактивного использования возьмите все, что вам нужно. эксперимент. мне нравится возможность использовать одну и ту же оболочку для интерактивного использования и для программирования.</p><p>я перешел с ksh88 на svr2 на tcsh, на ksh88sun (который добавил значительную поддержку интернационализации) и ksh93. я попробовал bash и ненавидел это, потому что это сгладило мою историю. затем я обнаружил <code>shopt -s lithist</code> и все было хорошо. (параметр <code>lithist</code> гарантирует, что переводы строк сохраняются в истории команд.)</p><p>для программирования shell я бы настоятельно рекомендовал ksh93, если вам нужен согласованный язык программирования, хорошая совместимость с posix и хорошая производительность, так как многие обычные команды unix могут быть доступны как встроенные функции.</p><p>если вы хотите мобильности, используйте по крайней мере оба. и убедитесь, что у вас есть хороший набор тестов.</p><p>есть много тонких различий между оболочками. рассмотрим, например, чтение из канала:</p><pre><code>b=42 && echo one two three four | read a b junk && echo $b </code></pre><p>это даст разные результаты в разных оболочках. корн-шелл управляет трубопроводами спереди назад; последний элемент в конвейере выполняется в текущем процессе. bash не поддерживал это полезное поведение до v4.x, и даже тогда, это не по умолчанию.</p><p>другой пример, иллюстрирующий согласованность: сама команда <code>echo</code>, которая устарела из-за разделения между bsd и sysv unix, и каждая из них ввела свое собственное соглашение о том, чтобы не печатать переводы строки (и другое поведение). результат этого все еще можно увидеть во многих скриптах 'configure'.</p><p>кш принял радикальный подход к этому - и ввел команду <code>print</code>, которая фактически поддерживает оба метода (опция <code>-n</code> из bsd и завершающий специальный символ <code>\c</code> из sysv)</p><p>однако для серьезного системного программирования я бы порекомендовал что-то иное, чем shell, например, python, perl. или сделайте еще один шаг вперед и используйте платформу, подобную марионетке, которая позволяет вам отслеживать и корректировать состояние целых кластеров систем при хорошем аудите.</p><p>программирование на оболочке похоже на плавание в неизведанных водах или еще хуже.</p><p>программирование на любом языке требует знания его синтаксиса, его интерфейсов и поведения. программирование оболочки не отличается.</p>

<p>это битва между unix и linux. в большинстве, если не во всех дистрибутивах linux установлен bash, а ksh необязателен. большинство систем unix, таких как solaris, aix и hpux, имеют ksh по умолчанию.</p><p>лично я всегда использую ksh, мне нравится завершение vi, и я в значительной степени использую solaris для всего.</p>

<p>для скриптов я всегда использую <em> ksh </em>, потому что он сглаживает <a href="https://stackoverflow.com/questions/2732/shell-scripting-input-redirection-oddities#12412">gotchas</a> .</p><p>но я считаю <em> bash </em> более удобным для интерактивного использования. для меня <em> привязки клавиш emacs </em> и завершение табуляции являются основными преимуществами. но это в основном сила привычки, а не какие-либо технические проблемы с <em> ksh </em>.</p>

<p>у меня нет опыта работы с ksh, но я использовал и bash, и zsh. я предпочитаю zsh, а не bash, потому что он поддерживает очень мощные операции с файлами, модификаторы расширения переменных и более быстрое завершение табуляции.</p><p>вот краткое введение: <a href="http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/">http://friedcpu.wordpress.com/2007/07/24/zsh-the-last-shell-youll-ever-need/</a> </p>

<p>мой ответ будет "выбрать один и научиться его использовать". они оба достойные снаряды; bash, вероятно, имеет больше наворотов, но у них обоих есть основные функции, которые вы захотите. bash более универсален в наши дни. если вы используете linux все время, просто придерживайтесь его.</p><p>если вы программируете, попытка придерживаться простого 'sh' для мобильности является хорошей практикой, но тогда с bash, доступным в наши дни так широко, что немного советов, вероятно, немного старомодно.</p><p>узнайте, как использовать завершение и свою историю shell; время от времени читайте man-страницу и пытайтесь узнать несколько новых вещей.</p>

<p>@foxxtrot</p><p>на самом деле, стандартная оболочка - bourne shell (<code>sh</code>). <code>/bin/sh</code> в linux на самом деле <code>bash</code>, но если вы стремитесь к кроссплатформенным сценариям, вам лучше придерживаться возможностей оригинальной оболочки bourne или писать что-то вроде <code>perl</code>.</p>

<p>во-первых, у bash есть вкладка завершения. одного этого достаточно, чтобы я предпочел его, а не ksh.</p><p> <a href="http://zsh.org/">z shell</a> имеет хорошую комбинацию уникальных функций ksh с вещами nice, которые предоставляет bash, плюс еще много чего еще.</p>

<p>доступный в большинстве систем unix, ksh соответствует стандарту, четко разработан, хорошо округлен. я думаю, что книги, справки по ksh достаточно и ясно, особенно книга о'рейли. баш это масса. я держу его только как root-логин для linux дома.</p><p>для интерактивного использования я предпочитаю zsh в linux/unix. я запускаю скрипты в zsh, но я протестирую большинство моих скриптов, хотя функции в aix ksh.</p>