Чи є причина використовувати bash над zsh? [зачинено]


33

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

То яка ж причина використовувати bash над zsh?


2
Просто хотілося зазначити, що ZSH не повністю сумісний з BASH. У ZSH індексація масиву починається з 1 - у BASH, індексація масиву починається з 0. Є й інші відмінності, але я хотів би вказати на це.
Чарльз Аддіс

Відповіді:


29

Приходять в голову дві причини:

По-перше - він доступний практично скрізь. У мене є кілька систем Linux (у цьому випадку CentOS 4.x), на яких не встановлено zsh. Так само я маю торкнутися старовинних систем, таких як Solaris 2.6 і новіших версій, HP-UX 10 і новіших версій, а також подібні скрипкі версії AIX. Тому мені дуже доводиться використовувати bash на цих комп’ютерах, що я роблю, тому що я торкаюся десяток, якщо не сотень, окремих комп'ютерів протягом місяця, і для того, щоб отримати послідовність у вашому інтерфейсі, ви в кінцевому підсумку застрягли за допомогою за замовчуванням.

По-друге - він доступний практично скрізь. Це означає, що я можу написати скрипт bash shell і бути 99% впевненим, що він буде працювати при перенесенні в інше місце.

Так, ці причини поверхово однакові, але міркування за ними різні.


2
Я пам'ятаю, маючи ksh88 / ksh93 на HPUX, ми ніколи не мали доступу до встановлення bash.
Злеміні

24

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

Я вважаю, що це робить все простішим, тому що навіть коли я знімав будь-який баш-сумісний (setopt SH_WORD_SPLIT?), Я все ще стикаюся з тонкими відмінностями.


3
Це була б кожна система GNU / Linux, яку ви маєте на увазі?
andol

2
Ну, я виявив, що він постачається з OS / X і bsd, я не маю великого досвіду роботи з іншими * nix-тами, чи у них (останні версії) зазвичай не буває?
Кайл Брандт

1
Старіші версії Solaris не включали bash; Я, як правило, повинен був залежати від того, як Борн був оболонкою для сценаріїв. Це не так вже давно, але ви все ще можете зіткнутися з цим на деяких великих підприємствах.
user5336

3
Повинен був бути інший BSD: s тоді. Принаймні, у OpenBSD та FreeBSD вам потрібно встановити bash окремо від портів / пакетів.
andol

andol: Це ті, якими я користувався .. Я повинен пам'ятати неправильно, або я це зробив і просто не пам'ятаю.
Кайл Брандт

13

zsh не повністю сумісний з bash. Існують найрізноманітніші відмінності. Новіший zsh більше сумісний з bash (= ~ підтримується, у exec тепер є додаткові параметри прапора тощо), але повна сумісність не є ціллю, навіть не під "емуляцією".

Наприклад, bash substring - $ {foo: offset: len}, але в zsh це $ foo [start, end], і це лише один простий приклад.

zsh - оболонка під впливом tcsh та ksh, яка робить багато речей по-своєму; Сумісність POSIX явно не є метою, але розробники реагують на патчі, які додають параметри / імітують поведінку, що наближає речі до POSIX. Але коли ти починаєш реально вбиратись у силу оболонки, ти починаєш створювати сценарії лише для запису, навіть більше ніж bash.

bash - це POSIX sh + ksh + педантизм, деякі функції тепер скопійовані з zsh. Він також має сценарії лише для запису, але оскільки він має менш потужні оператори, ви, зрештою, не використовуєте лаконічність zsh, і речі можуть бути читабельнішими (за винятком усіх цитувань, щоб уникнути розбиття білого простору, дурний масив $ ksh у стилі ksh означає спочатку -елемент масиву, а не всі елементи масиву тощо тощо).

Писати сценарії, які повністю користуються потужністю будь-якої оболонки, нерозумно, якщо ви не перебуваєте в обмеженому середовищі (наприклад, написання системних сценаріїв rc, де деякі FS не можуть бути встановлені тощо). Як ідеал, використовуйте Perl / Python / Ruby / все, що завгодно велике, що вам потрібна виразність не в Bourne sh, якщо ви хочете, щоб інші могли підтримувати його. Зберігайте матеріали оболонки для речей, що стосуються інтерактивної оболонки (програмування доповнення вкладок тощо).

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


6
NB: $ {Foo: зміщення: Len} в даний час підтримується в Zsh, для сумісності.
Phil P

6

Моя порада: якщо ви збираєтесь отримати абсолютну портативність, пишіть, використовуючи правила оболонки Bourne, навіть не турбуйтеся з розширеннями оболонки Korn. Як згадувалося, це старі "великі ящики" навколо, які взагалі не мають оболонок GNU.

Bash вже робить "занадто багато". У мене є друг на роботі, який віддає перевагу zsh, але я не знаю, що саме це робить.

У будь-якому випадку, або напишіть для оболонки Bourne (або "bourne again"), або по черзі, якщо ви робите спеціальний сценарій для невеликої кількості конкретних полів, повністю пропустіть "shell shell" і просто напишіть, використовуючи perl або python (або що завгодно) ваш улюблений місцевий перекладач).


5

На додаток до вищезгаданої причини переносимості, ще однією може бути те, що bash все ще додає функції.

Наприклад, bash v4.x + введено:

  • рекурсивний глобул:

    rm -f ** / *. журнал

  • autocd:

    Введіть "/ tmp" замість "cd / tmp"


2
Як функції копіювання bash з zsh є причиною використання bash?
qqx

5

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

Дурниці. Якщо ви знаєте, що кожна система, про яку ви дбаєте, має BASH, то це абсолютно розумна заява. BASH має багато корисних функцій, які неможливо розумно імітувати в POSIX sh. Несерйозне використання функцій, які не є POSIX, не є чудовою ідеєю, але використовувати їх тоді, коли вони вам справді потрібні.

Переносність не є абсолютною. Сперечається, як далеко вам потрібно це взяти, як і все інше. Наприклад, Fedora використовує команди оболонки для побудови пакетів RPM, а в інструкціях щодо упаковки Fedora вказується, що оскільки всі пакунки повинні бути побудовані на Fedora, то добре використовувати всі функції BASH. Незважаючи на те, що теоретично інші дистрибутиви без BASH можуть захотіти повторно використовувати свої вихідні RPM, вони прийняли рішення про переносність на основі практичності замість вашої "ЗАВЖДИ UZE POSIX !! 1" мантри.

ZSH не прижився як оболонка за замовчуванням, просто тому, що це безладний напівфабрикат.


2
Чи можете ви пояснити, які функції чи ідеї в zsh вважаєте напівзапеченими і чому?
funroll

2

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

Правильний спосіб написання портативних скриптів unix - це використання sh, яке є у кожній * nix-системі .

Кожна інша оболонка, крім shвашого щоденного інтерактивного інструменту.

Коли підходить до bashпорівнянні zsh- bashпоставляється в більш *nixesніж zsh, так що тут йде недоліки установки додаткового програмного забезпечення до системи - ви повинні підтримувати його. Деякі люди люблять zsh "круті риси", тому вони люблять платити цю ціну, деякі ні.


2
Багато сучасних реалізацій sh - це лише посилання на bash.
user9517 підтримує GoFundMonica

2
@Iain Ubuntu використовує тире за замовчуванням, і навіть якщо shце bash, він включає режим сумісності при запуску як sh.
mgorven

2

Ще один момент:

Багато програм за замовчуванням забезпечують прохолодне завершення bash. Для мене це причина не перемикатися.

[додано в липні 2013 р.] Після кількох років використання zsh з коментаря вище, я повинен сказати, що завершення вкладки (навіть вбудована в одну, без жодних модифікацій 3-го пареті) є блискучою і виглядає так, що це далеко за рамки запропонованого bash . :).


3
Я думаю, що це працює і з ZSH, і після заповнення вкладки в ZSH, я отримую багато конкретних програмних аргументів ...
Kyle Brandt

Цікаво. Ви хочете сказати, що файли завершення bash працюють із zsh, або просто деякі програми мають специфічні для zsh файли завершення? Ще є деякий std макет файлів завершення bash, які zsh можуть або не можуть розглянути автоматично. Ви налаштували ваш zsh config, щоб він працював?
Войцех Качмарек

@Wojciech Kaczmarek: Я думаю, що вам потрібно 19.3 з наступного: zsh.sourceforge.net/Doc/Release/zsh_19.html . Чесно кажучи, я ніколи не забирав часу, щоб зрозуміти це, просто зірвав .zshrc, який я знайшов в Інтернеті :-) Але він заповнить аргументи командного рядка з програм, таких як apt, grep, тощо.
Kyle Brandt

5
Завершення вкладки bash дуже схоже на стару систему доповнення zsh. Це одна з ідей, скопійованих з zsh в bash (є й інші, скопійовані bash в zsh). Ви можете використовувати сценарії завершення, написані для bash в zsh, запустивши "bashcompinit", а потім скориставшись командами "завершення" та / або "compgen" всередині zsh - це можливо, тому що функціональність bash є підмножиною доступної в zsh і тому можна наслідувати. Тому немає ніяких причин переходити на bash, оскільки команда постачається із завершенням bash.
Філ П
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.