Унікальні особливості bash порівняно з zsh


67

Я користувач zsh досить довгий час (до цього tcsh і до цього csh). Я цілком задоволений цим, але мені було цікаво, чи є якісь переконливі риси bash, яких немає в zsh. І навпаки, чи є zsh функції, яких немає в bash. В даний час я відчуваю, що баш краще:

  • Якщо ви вже знайомі з цим і не хочете вивчати новий синтаксис.
  • Він буде існувати на більшості всіх * nix-машин за замовчуванням, тоді як zsh може бути додатковою установкою.

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


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

Відповіді:


40

zsh для вулканів. ;-)

Серйозно: bash 4.0 має деякі функції, які раніше були знайдені лише в zsh, наприклад ** globbing:

% ls /usr/src/**/Makefile

еквівалентно:

% find /usr/src -name "Makefile"

але, очевидно, потужніший.

На мій досвід, програмоване завершення програми bash працює трохи краще, ніж zsh, принаймні для деяких випадків (наприклад, доповнення пакетів debian для можливостей).

bash має Alt + .вставити!$

zsh has expansion of all variables, so you can use e.g.

% rm !$<Tab>

for this. zsh can also expand a command in backtics, so

% cat `echo blubb | sed 's/u/a/'`<Tab>

yields

% cat blabb

I find it very useful to expand rm *, as you can see what would be removed and can maybe remove one or two files from the commmand to prevent them from being deleted.

Also nice: using the output from commands for other commands that do not read from stdin but expect a filename:

% diff <(sort foo) <(sort bar)

From what I read bash-completion also supports completing remote filenames over ssh if you use ssh-agent, which used to be a good reason to switch to zsh.

Aliases in zsh can be defined to work on the whole line instead of just at the beginning:

% alias -g ...="../.."
% cd ...

8
У БАШЕЄВ, C-M-eщоб «оболонка расшир лінії», яка буде розширюватися , cat `echo blubb | sed 's/u/a/'` щоб cat blabbі echo $SHELLдо echo /bin/bashв моєму випадку. Також C-x *до "глобул-розгорнути-слово", який би розширився rm *.
Віктор

16

Я хотів би зазначити, що bash не встановлений за замовчуванням на FreeBSD, OpenBSD або NetBSD, а також він не встановлений за замовчуванням на Solaris 10 (у OpenSolaris є його за замовчуванням), востаннє я використовував AIX та або На серверах HP-UX він також не був встановлений за замовчуванням.

Крім того, на OpenSolaris / bin / sh НЕ баш. Це кш. Найбільші проблеми, які я маю як переносник програмного забезпечення, - це люди, які припускають, що / bin / sh є bash і що він прийме синтаксис розширеного bash. Незважаючи на те, що це стосується більшості дистрибутивів Linux, в інших місцях це не так, і це насправді дратує.


6
Так, ти правий. На жаль, всі ці постачальники впевнені, що це дуже просто встановити bash як додатковий пакет. +1 для вказування на необхідність / bin / sh пуризму в сценаріях.
kubanczyk

@kubanczyk: Якщо ви працюєте на машинах, до яких ви не маєте кореневого доступу, можливо, це не так просто встановити, тому я думаю, що точка X-Istence стоїть. (Я працюю над купою ящиків Solaris, і sysadmins - це всі наркотики ksh. Минулого разу я спробував скласти власне програмне забезпечення, без якого я не міг би жити (git у цьому випадку) були недоліки з встановленим компілятором, так що навіть цей маршрут був перерізаний мені.)
iconoclast

12

Хоча я баш-користувач, одна з особливостей zsh вважаю досить класною: RPS1.

Пам'ятайте:

  • PS1: підказка зліва вліво
  • RPS1: правильний виклик

Зразок:

При використанні чогось подібного

PS1=’%B(%h) %m%#%b 
RPS1=’(%20<…<%~)'

Ви отримуєте підказку зліва, а поточний каталог висувається праворуч. Він навіть зникає, коли поточна лінія стає занадто довгою! Це тому, що zsh досить розумний, щоб надати низький пріоритет RPS1.

Ви можете побачити знімок екрана цього прикладу на веб- сайті http://imgur.com/OAZhC .


9

Zsh має корекцію орфографії. Якщо ви відіслали лист (або більше), воно зрозуміє, що ви мали на увазі.

Він також має більш надійне завершення вкладок, що мені подобається.

Zsh має інтерактивну утиліту конфігурації, щоб встановити, як вам подобається.

Деякі тести на швидкість кажуть, що zsh швидше, але я не помітив різниці.


1
Стривана версія тире, яка підтримує лише підмножину її функцій, і призначена для використання в сценаріях, які повинні працювати швидко (наприклад, такі, які починаються), - тире.
Чаккі

zshнавіть має налаштування, щоб дозволити "одноразове вимкнення" для використання клавіатури Dvorak.
vgoff

6

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

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

Нарешті я можу використовувати одну і ту ж оболонку в кожній системі Unix, не варто її порушувати на функції, які я ніколи не використовуватиму.

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


3

bash має багато функцій, які раніше були лише в zsh. Тепер ви можете мати «розумне завершення вкладок» з bash aswell, як виявив будь-який останній користувач ubuntu.


1

Заміна процесів і розширене глобалізація - це дві особливості, які я б найбільше пропустив. Налаштування підказки теж досить круті - бачите рівень вкладеності під час введення складних операторів у командних рядках. Автозавантаження робить включно безліч функцій у кожній оболонці можливою.


Я припускаю, що ви маєте на увазі, що ви пропустили б з zsh, оскільки AFAIK все, що ви згадали, включено до zsh? (Але ви впевнені, що всі вони відсутні у башті? Це мене здивувало б.) У будь-якому випадку, додавши це, це зробить вашу відповідь зрозумілішою, оскільки з обох боків забору баш / зш є люди. Крім того, було б корисно, якби ви навели приклади того, як кожна з цих функцій полегшує вам життя оболонки.
іконоборство

0

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

Хтось також сказав, що я згинаю свій фактор вигляд за допомогою zsh, але я не можу підтвердити чи спростувати цю чутку.


5
і так, у bash також є підтримка vi-mode.
pjz

@Milner: чи можете ви пояснити, що таке підтримка vi режиму в zsh, а не в bash? Якщо ви просто маєте на увазі можливість робити набір -o vi в командному рядку, то це однозначно в обох. Якщо в zsh є якась розширена підтримка, чи можете ви чітко описати, що це таке і що він додає?
іконоборство

-1

Популярність, #bash 430 користувачів. #zsh 123 користувачів. Я вважаю, що веб-сайт zsh добре порівняє zsh з іншими оболонками. zsh має кращу підтримку режиму vi.


2
Наскільки краще режим vi в режимі zsh? Я баш-користувач і ввімкнено режим vi-mode, тому я хотів би знати, чи є якась користь у переключенні.
птман

1
@ptman: запрошення zsh можна зробити, щоб повідомити про режим (вставка / нормальний). Readline не може цього зробити. Підказка також гнучкіша: ви можете мати підсвічування синтаксису тощо!
unperson325680

@progo: ах! дуже хороша. Тепер я просто можу почати використовувати режим vi в zsh. Це була одна з моїх причин того, що я дотримувався режиму emacs поки що.
іконоборство

@Brandon це невелике посилення стало причиною для мене перемикання снарядів.
unperson325680

-1

Bash використовує той самий синтаксис для, якщо і поки це можна використовувати в / bin / sh сценаріїв у командному рядку.
Усередині zsh синтаксис інший. Ефективно використовуючи zsh, ви повинні запам'ятати обидва, якщо ви використовуєте команду if- або while у командному рядку


1
Я спробував це, використовуючи if [[ $test = "test" ]]; then echo "success"; else echo "failure"; fiі в командному рядку, і в скрипті, і це працювало як очікувалося в обох випадках. Тож здавалося б, ви не маєте прямо своїх фактів.
іконоборство

Це залежить від того, що ви встановили як / bin / sh. Якщо / bin / sh - баш, то ви праві. Інакше баш не має такої переваги. Якщо zsh є / bin / sh, zsh має цю перевагу. Враховуючи всі різні оболонки, які могли б забезпечити / bin / sh, я особисто рекомендую просто використовувати оболонку, яку ви хочете, для сценаріїв оболонок, щоб її відсутність вказувала на проблему з очевидним виправленням, а не на химерні форми поведінки, що не мають поняття про те, як це зробити вирішувати.
Ед Грімм
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.