Уникальные особенности bash по сравнению с zsh


67

Я был пользователем zsh уже довольно давно (до этого tcsh и до этого csh). Я вполне доволен этим, но мне было интересно, есть ли какие-нибудь неотразимые особенности bash, которых нет в zsh. И наоборот, есть ли функции zsh, которых нет в bash. Мое нынешнее ощущение, что Bash лучше:

  • Если вы уже знакомы с ним и не хотите изучать новый синтаксис.
  • Он будет существовать на большинстве всех * nix-машин по умолчанию, тогда как zsh может быть дополнительной установкой.

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


10
Как функции, которые являются уникальными для одного или другого субъективного? Я, честно говоря, не ищу огненную войну и допускаю, что знакомство с одним или другим, вероятно, является хорошей причиной, чтобы предпочесть эту оболочку.
Тим

Ответы:


40

Zsh для вулканов. ;-)

Серьезно: bash 4.0 имеет некоторые функции, ранее встречавшиеся только в zsh, например ** globbing:

% ls /usr/src/**/Makefile

эквивалентно:

% find /usr/src -name "Makefile"

но, очевидно, более мощный.

По моему опыту программируемое завершение bash работает немного лучше, чем zsh, по крайней мере, в некоторых случаях (например, завершение пакетов Debian для aptitude).

Баш должен 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
В bash, C-M-eдо «shell-expand-line», которая в моем случае будет расширяться cat `echo blubb | sed 's/u/a/'` до cat blabbи echo $SHELLдо echo /bin/bash. Также C-x *к «glob-expand-word», которое бы расширилось rm *.
Виктор

16

Я хотел бы отметить, что bash не устанавливается по умолчанию во FreeBSD, OpenBSD или NetBSD, а также не устанавливается по умолчанию в Solaris 10 (в OpenSolaris он используется по умолчанию), в прошлый раз, когда я использовал AIX, и или Серверы HP-UX также не были установлены по умолчанию.

Кроме того, на OpenSolaris / bin / sh НЕ является Bash. Это кш. Самые большие проблемы, с которыми я сталкиваюсь как носитель программного обеспечения, это люди, которые считают, что / bin / sh - это bash и что он принимает расширенный синтаксис bash. Хотя это, похоже, имеет место в большинстве дистрибутивов Linux, это не так в других местах, и это действительно раздражает.


6
Да ты прав. Увы, все эти поставщики, несомненно, позволяют очень легко установить bash в качестве дополнительного пакета. +1 за указание на необходимость / bin / sh пуризма в скриптах.
kubanczyk

@kubanczyk: Если вы работаете на компьютерах, к которым у вас нет доступа с правами root, то, возможно, его будет не так просто установить, поэтому я думаю, что точка X-Istence стоит. (Я работаю над несколькими блоками Solaris, и все системные администраторы являются наркоманами ksh. В прошлый раз, когда я пытался скомпилировать свое собственное программное обеспечение, без которого я не мог бы жить (в данном случае git), были недостатки с установленным компилятором, так что даже этот маршрут был отрезан от меня.)
иконоборец

12

Хотя я пользователь bash, я нахожу одну из функций zsh довольно крутой: RPS1.

Помните:

  • PS1: выравнивание по левому краю
  • RPS1: справа выровненный запрос

Образец:

При использовании чего-то вроде

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

Вы получаете приглашение слева, а текущий каталог - справа. Он даже исчезает, когда текущая строка становится слишком длинной! Это потому, что Zsh достаточно умен, чтобы отдавать низкий приоритет RPS1.

Вы можете увидеть скриншот этого примера на http://imgur.com/OAZhC .


9

У Zsh исправлена ​​орфография. Если вы откажетесь от письма (или больше), он поймет, что вы имели ввиду

Он также имеет более надежное завершение вкладки, что мне нравится

Zsh имеет интерактивную утилиту конфигурации, чтобы настроить ее так, как вам нравится.

Некоторые тесты скорости говорят, что zsh быстрее, но я не заметил никакой разницы.


1
Урезанная версия dash, которая поддерживает только часть своих функций и предназначена для использования в сценариях, которые должны работать быстро (например, при запуске), - это dash.
Чаки

zshдаже имеет настройку, позволяющую вводить опечатки «одна буква» для использования клавиатуры Дворжака.
vgoff

6

Я не знаю никаких функций bash, которые не поддерживает zsh. Целью разработки zsh является поддержка любых функций, которые добавляет bash.

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

Наконец, я могу использовать одну и ту же оболочку в каждой системе Unix, не стоит ломать ее из-за функций, которые я никогда не буду использовать.

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


3

Bash имеет много функций, которые раньше были только в Zsh. Теперь у вас есть возможность «завершить умную вкладку» с bash, как это обнаружил любой недавний пользователь Ubuntu.


1

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


Я предполагаю, что вы имеете в виду, что вы пропустите те из zsh, так как AFAIK все, что вы упомянули, включено в zsh? (Но вы уверены, что все они отсутствуют в bash? Это меня удивит.) Во всяком случае, добавление, которое сделает ваш ответ более понятным, так как есть люди, отвечающие по обе стороны забора bash / zsh. Кроме того, было бы полезно, если бы вы привели примеры того, как каждая из этих функций облегчает жизнь вашей оболочке.
иконоборчество

0

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

Кто-то также сказал, что я использую 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? Я пользователь bash и у меня включен режим vi, поэтому я хотел бы знать, есть ли какая-то польза от переключения.
Птман

1
@ptman: приглашение zsh можно указать для режима (insert / normal). Readline не может этого сделать. Подсказка также более гибкая: вы можете иметь подсветку синтаксиса и т. Д.!
unperson325680

@progo: ааа! очень хорошо. Теперь я могу начать использовать режим vi в zsh. До сих пор это была одна из моих причин придерживаться режима emacs.
иконоборчество

@ Брендон, это небольшое улучшение было причиной для меня, чтобы переключить оболочки.
unperson325680

-1

Bash использует тот же синтаксис для if и while, который можно использовать в скриптах / bin / sh в командной строке.
Внутри zsh синтаксис другой. Эффективно используя zsh, вы должны запомнить оба, если вы используете оператор if- или while в командной строке


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

Это зависит от того, что вы установили как / bin / sh. Если / bin / sh это bash, то вы правы. В противном случае, Bash не имеет этого преимущества. Если zsh - это / bin / sh, у zsh есть это преимущество. Учитывая все различные оболочки, которые могут предоставить / bin / sh, я лично рекомендую просто использовать оболочку, которую вы хотите для сценариев оболочки, так что ее отсутствие указывает на проблему с очевидным исправлением, а не на причудливое поведение без понятия о том, как разрешить.
Эд Гримм
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.