Які принципові відмінності між основними * NIX оболонками? [зачинено]


52

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

Крім того, чи є вплив на написані користувачем сценарії оболонок під час роботи під однією або іншою оболонкою або це просто питання зміни оболонки у верхній частині файлу? Мій інстинкт говорить, що це не так просто.

Відповіді:


52

Для інтерактивного використання є два основні суперники, bash і zsh , плюс страглер tcsh і новачка риби .

  • Bash - офіційна оболонка проекту GNU і оболонка за замовчуванням для більшості дистрибутивів Linux. Що стосується інших уніцій, які не постачаються з гідною інтерактивною оболонкою як частиною базової установки, я думаю, що баш - це те, що люди, як правило, обирають, у самозміцненому циклі «баш є скрізь, тому я теж буду його використовувати». Дивіться також Чому всюди баш? (з великою кількістю історичної інформації).

  • Zsh має майже кожну особливість bash та багато інших (корисних!) Функцій. Його головний недолік - це менш відомий, що, як практична справа, означає, що ви менше шансів виявити його вже встановленим у системі, яку створив хтось інший, і існує менше сторонньої документації про це. Дивіться також Які функції zsh ви використовуєте? , Які особливості є у zsh та відсутні у bash, чи навпаки? .

  • Tcsh колись (до початку 1990-х) був оболонкою з найкращими інтерактивними функціями, як і його попередник csh. Це зробило його популярним для інтерактивного використання (але не для сценаріїв ). Zsh наздогнав tcsh і досить швидко покращився далі, і bash наздогнав (із програмованим завершенням) на початку 2000-х, тоді як tcsh ледь не досяг жодного прогресу за останні 15 років. Тому зараз мало розуму вчитися ткш.

  • Риба намагається бути чистішою за своїх попередників. Він має деякі акуратні особливості (простіший синтаксис, забарвлення синтаксису в командному рядку), але не вистачає інших (що б автор не любив). Рибне співтовариство набагато менше, ніж навіть 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 Sh (масиви, асоціативні масиви, розширені (кульки *(foo), @(foo|bar)...), нульові грудки ( ~(N)foo*), ...). Ksh спочатку комерційне програмне забезпечення (воно стало безкоштовним у 2000 році, після встановлення деяких звичок), і багато безкоштовних уніцій (Linux, * BSD) ввійшли в звичку лише надавати набагато старшому вільному клону ( pdksh ), якому бракувало багатьох цих корисних функцій . Pdksh зараз витісняється mksh поза OpenBSD, але навіть mksh не вистачає на реалізацію всіх функцій ksh93. Сьогодні ви не можете розраховувати, що ksh93 буде доступний всюди, особливо в Linux, де bash є нормою.

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

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

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


4
Для сценаріїв я націлюю тире (якщо мені не потрібні розширені функції bash), який має мінімальний набір функцій, і подає скаргу posix на максимальну сумісність. (і це невеликий легкий і швидкий)
hildred

Чудовий документальний фільм! Дві ноти. По-перше, Solaris - це одне з "комерційних об'єднань, де / bin / sh не відповідає POSIX". Зокрема, він використовує jsh(що не є оболонкою java!), Якому не вистачає змінної підстановки, як ${VAR#foo}і ${VAR%bar}.
Адам Кац

По-друге, tcshдосить популярний серед користувачів UNIX, які навчилися їх хитрощів до ~ середини 90-х років (де відбулося впровадження обох bashта zsh), особливо серед старих Cрозробників UNIX + , які розпочали життя csh(нагадування, c в cshстендах для Cмови , що було натхненником його відмінностей від оболонок у стилі бурн). Дивіться також програмування Csh, що вважається шкідливою , яку я часто використовую для порад щодо POSIX глибокої магії (крім її аргументів анти-csh).
Адам Кац

Mac OS X ніколи не є "OS / X". (: І як zsh несумісний з Борном? (Ну, за винятком таких речей, як нерозбірні розширення змінних слів.)
SilverWolf - Відновіть Моніку

@seaturtle Нероздільні розширення змінних розбитків не є основною різницею, яка б порушила багато скриптів sh, якщо ви спробували запустити їх з zsh (якщо ви не запускаєте zsh в режимі емуляції sh / ksh).
Жил "ТАК - перестань бути злим"

27

Є два основних аромати шкаралупи, sh (наприклад, bash) і csh (наприклад, tcsh). Для інтерактивного використання воно здебільшого зводиться до того, до чого ви звикли. Я використовував csh, а потім tcsh, роками, і було б болісно перемикатися, просто тому, що я до цього звик. Я також використовував bash, і я не думаю, що є переконливі причини переключитися. За винятком випадків, якщо одне чи інше недоступне на машинах, якими ви регулярно користуєтесь.

Для програмування синтаксис відрізняється. Ви не можете просто змінити оболонку, але також потрібно змінити синтаксис сценарію. Для сценаріїв потрібно використовувати sh або bash. Синтаксис набагато прихильніший до сценаріїв, як пояснено тут (спасибі Рікардо Муррі за посилання. Це хороший посібник з баш сценаріїв.

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


12

Ще в старі часи, коли AT&T винайшов UNIX, там був Борн Шелл, написаний Стівом Борном. Це було досить просто, і не вистачало багато інструментів, які ми сьогодні приймаємо як належне.

AT&T насправді не займався бізнесом UNIX, тому в цей час Беркелелі дещо прийняла саму базову ОС, і вони внесли деякі зміни в 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, що позначають варіанти.

Потім прийшли FSF і GNU OS. Вони хотіли створити власну ОС сумісну з UNIX на ім'я Hurd, і хотіли кращої оболонки для неї. Вони назвали bash, для Bourne Again SHell. Правила POSIX прийшли як раз в цей час, і вони хотіли б зробити в POSIX оболонку. Вони озирнулися, взявши синтаксис із оболонки Борна та вдосконалення з оболонки Корна, плюс крадіжку та розширення інтерактивних функцій із tcsh. Він став фактично оболонкою в Linux, тому це дуже часто.

Існує також zsh, написане як "кінцева" оболонка. Він також дуже поширений у світі Linux. Це розширило башти (і перехресно запилилося трохи, нові речі повернулися назад до удару).

Якби я обирав оболонку, я б вибрав bash або zsh. Баш, можливо, в ще декількох місцях, ніж zsh. zsh потужніший, але баш для мене був чудовим. Real / bin / sh Bourne оболонка існує лише з історичних причин. bash має майже все, що може запропонувати ksh та багато іншого. Синтаксис чистіший за csh чи tcsh та має кращі функції, ніж будь-який із них.

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


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

8

Дві основні гілки оболонок - похідні оболонки Борна (ш, баш, кш, ясень, яш і зш) та похідні csh (tcsh і ... uhm ... tcsh).

Я підозрюю (хоча у мене немає фактичних цифр), що bash є найбільш широко використовуваним, здається, він є оболонкою за замовчуванням у більшості Linux.

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

Особисто я використовував ksh, коли я починав роботу, тому що це було в системі, яку я використовував. Зараз я в основному використовую bash.


1
риба є CSH надихнуло оболонки
hildred

1

Я з часом використовував численні мушлі. Не нічого супер просунутого, але багато практичного систематичного програмного забезпечення та програмного забезпечення, що вимагало достатньої настройки.

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.