Какие функции есть в zsh и отсутствуют в bash или наоборот?

62

Как пользователь Linux, я всегда использовал bash, потому что он использовался по умолчанию в каждом дистрибутиве, который я использовал. Люди, использующие другие системы Unix, такие как BSD, используют другие оболочки гораздо чаще. Чтобы узнать немного больше, я решил попробовать Zsh.

Как пользователь bash:

  • Какие функции я буду скучать?
  • И что я должен высматривать?
Мача
источник
5
@ Жиль, когда-нибудь было бы неплохо, чтобы все те переехали сюда ... и объединились
xenoterracide

Ответы:

45

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

  • Функция zsh, которую мне больше всего не хватает, когда я время от времени использую bash, - это autocd: в zsh выполнение каталога означает его изменение при условии, что вы включите эту autocdопцию.

  • Еще одна очень полезная функция - это модная шумиха. Эти иероглифы символы немного трудно запомнить , но очень удобно (как это часто бывает быстрее искать их , чем писать эквивалентную findкоманду). Несколько простых примеров:
        foo*~*.bak= все совпадения, foo*кроме совпадающих *.bak
        foo*(.)= совпадение только с обычными файлами foo*
        foo*(/)= совпадение только с каталогами foo*
        foo*(-@)= совпадение только с символическими ссылками foo*
        foo*(om[1,10])= совпадение 10 самых последних файлов foo*
        foo*(Lm+1)= только файлы размером> 1 МБ = в каталоге и во всех его подкаталоги, рекурсивно⁴
        dir/**/foo*foo*dir

  • Для причудливых переименований zmvможет пригодиться встроенная функция. Например, чтобы скопировать каждый fileв file.bak:zmv -C '(*)(#q.)' '$1.bak'

  • И bash, и zsh имеют приличную систему завершения, которую нужно включить явно ( . /etc/bash_completionили autoload -U compinit; compinit). Zsh's гораздо более настраиваемый и в целом более привлекательный.

Если вы запускаете zsh без .zshrc, он запускает интерактивное меню, которое позволяет вам выбрать параметры конфигурации. (В некоторых дистрибутивах это можно отключить; в этом случае запустите autoload zsh-newuser-install; zsh-newuser-install.) Я рекомендую включить рекомендуемые параметры истории, включить завершение (в «новом стиле») и включить «общие параметры оболочки», за исключением beep. Позже настройте дополнительные параметры по мере их обнаружения.

² В то время программируемое завершение было убийственной особенностью zsh, но вскоре его приобрел bash.
Функции, которые bash приобрел только в версии 4 (поэтому они еще не доступны во многих системах), относятся к более мелкому типу.

Жиль "ТАК - перестань быть злым"
источник
5
Bash 4.0 теперь поддерживает autocdфункцию, которую вы обсуждали выше. Включите функцию с помощью команды shopt -s autocd. Тогда функция работает так, как вы описали.
Philluminati
У zsh также есть встроенная whereкоманда, которую не следует путать с whichкомандой.
Сильдорет
@EdGrimm Я думаю, что GNU и FreeBSD могут делать все, что могут делать классификаторы глобальных переменных zsh (с -execоболочкой для таких вещей, как выделение с помощью eи конвейерная обработка в такие инструменты, как sortи sedдля перезаписи eи сортировки). Конечно, более многословно.
Жиль "ТАК - перестань быть злым"
После проверки и перепроверки страницы поиска более десяти лет, я думаю, я действительно перестал искать. Но если бы я проверил последний раз перед комментированием, я бы, по крайней мере, видел опцию -size, которая переводит единицы измерения в байты.
Эд Гримм
11

Также завершение вкладки по умолчанию лучше, чем bash ... например ...

~/.e.dTAB расширится до ~/.emacs.d/Zsh, Bash просто подаст звуковой сигнал.

ocodo
источник
это не так. какой setoptвариант не по умолчанию вы используете для этого (если есть)?
Я понял, что я _-.поставил подстановочный знак. zstyle ':completion:*' matcher-list 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=*' 'l:|=* r:|=*' , См stackoverflow.com/q/7906078/311660
ocodo
10

zshпозволяет редактировать многострочную команду (см. zsh line editor ), bash - нет. Если вы попробуете тот же трюк ( Ctrl-p), bash получит последнюю команду.

Педро Силва
источник
2
Bash делает это, по крайней мере, начиная с версии 4.2.37; он заменяет символы новой строки на точки с запятой и дает вам одну строку для редактирования.
Кит Томпсон
1
Все еще не так хорошо. (:
Серебряный Волк - Восстановить Монику
8

Bash имеет возможность открывать порты, используя

/dev/tcp/host/port

или же

/dev/udp/host/port

Тем не менее, он отключен в Debian, поскольку рассматривается как препятствие (если путь действительно существует) и выходит за рамки того, что должна делать оболочка. Больше информации [список рассылки debian]

Portablejim
источник
5
У zsh есть встроенный ztcp, который имеет больше возможностей, чем bash / dev / tcp, но не имеет / dev / udp. Я бы предпочел использовать socat, хотя.
Стефан Шазелас
2

Который - улучшен в Zsh

Команда whichв bash показывает только местоположение команды.

В Zsh whichпокажут определение alias, источник functionи расположение команды.

Допустим, у нас был псевдоним оболочки:

alias gg='git log'

В Bash, если мы спросим: which ggрезультат будет недействительным

В Zsh: which ggдаст нам ...

gg: aliased to git log

Допустим, у нас была функция оболочки:

hello() {
    echo "Hello World"
}

В Bash, если бы мы спросили: which helloрезультат будет недействительным.

В Zsh: which helloдаст нам ...

hello() {
    echo "Hello World"
}
ocodo
источник
Bash обеспечивает ту же функциональность через type(встроенную) команду. И просто чтобы придираться: whichэто внешняя команда, а не встроенная команда bash.
Торкель Бьёрнсон-Ланген
Соответствующий канонический вопрос: почему бы не использовать «который»? Что использовать тогда?
Энтони Дж - правосудие для Моники
0

зш - полная оболочка

Многие из них, прочитав zshcontrib(1)одну, могут обнаружить две версии autoloadиграбельных tetrisигр (другая с ncurses), zshконкурирующими emacsза полноту (как описано).

знак равно

Я хотел бы упомянуть =ключевое слово, которое может вызвать раздражение curl(URL обычно есть ?var=valв них; но это unsetoptвозможно, я думаю):

  • q file =less( gentoo) решает вq file $(which less)

= расширяется до полного пути рассматриваемой команды.

другие вкусности

другие вещи, вне сознания, - это правильное приглашение RPS1=%d(для отображения $PWDв стиле), Alt + H( run-helpто есть. man), Alt + ? ( which-command) varedи zed( autoloadфункция), минимаффероподобный Emacs Alt + Xдля выполнения виджетов без их привязки, глобальные и суффиксные псевдонимы, расширенная длительность выполнения команды отслеживания истории -mи -regexсоответствия, эмуляция оболочки (например csh, kshс помощью emulate) и autoload run-helpс фрагментами файлов для встроенных модулей.

плач Иеремии

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

bashкажется, более распространены в readline(в противоположность zle) и gnu historyв духе Linux; Например, функции readline и сочетания клавиш могут применяться глобально (как хранятся в ~/.inputrcи /etc/inputrc), если они не переопределяются специфичными для bash bind.

заключение

Я лично думаю emacs(особенно из-за перспективы (нынешнего?) emacs-noxАромата), который послужил вдохновением для такого исключительного программного обеспечения, zshи tmuxсделал очень хорошую работу, чтобы быть примером в такой реализации; для людей, ценящих его ценность (до уровня не нуждающихся / зависящих от Xсервера). Оболочка Unix достаточно мощная, а ее непрерывность и согласованность достаточны для правильного рабочего процесса и производительности (в целом вычислений).

ocodo
источник