Как поменять zsh на bash mac os

Обновлено: 01.07.2024

Я не нашёл краткого описания этих отличий когда переходил сам, и мне пришлось потратить немало времени на вычитывание документации zsh. Надеюсь, эта статья упростит вам переход на zsh.

Зачем переходить

Для начала — а стоит ли вообще тратить своё время и внимание на переход? Учить ещё один диалект sh, менее распространённый чем POSIX sh или bash, заново заниматься настройкой рабочего окружения…

На мой взгляд, если вы проводите много времени в консоли, вам нравятся Vim или Emacs и вы уже потратили немало времени на их настройку "под себя" — однозначно стоит! Zsh по духу очень на них похожа: это очень сложная и гибкая программа, чьи возможности полностью мало кто знает, но потратив некоторое время на настройку можно получить очень удобную лично вам рабочую среду.

Что касается изучения нового диалекта sh… пользы от этого, скорее всего, действительно мало, но описанного в этой статье минимума должно быть достаточно чтобы настраивать zsh, а писать новые скрипты на диалекте zsh вам никто и не предлагает. В общем и целом это ничем не отличается от необходимости минимально знать VimL или Emacs Lisp исключительно для настройки Vim/Emacs.

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

  • Zsh не использует readline для ввода команд пользователем. Вместо этого используется собственный редактор ZLE (Zsh Line Editor). Это позволило реализовать множество фич: удобное редактирование многострочных команд, подсветку синтаксиса прямо в процессе ввода команды, особую обработку "paste" из clipboard чтобы не выполнить случайно вставленный текст, гибкое управление горячими клавишами, undo (в т.ч. отменяющее результат автодополнения и разворачивания glob-ов)… плюс интегрировать функционал редактора с zsh, что позволяет управлять его поведением через обычные функции zsh (например, подсветка синтаксиса так и реализована).
  • Невероятно сложный и гибкий механизм автодополнения команд. Он сильно зависит от контекста, поэтому при нажатии <Tab> в разных местах командной строки будут дополняться разные вещи: имена команд, их параметры, файлы, имена пользователей и серверов, номера процессов, названия переменных, индексы массивов и ключи хешей, элементы синтаксиса zsh, названия цветов и шрифтов, сетевых интерфейсов, системных пакетов… короче, вообще всего что можно автодополнять. И его можно детально контролировать, вплоть до изменения логики автодополнения для конкретного контекста у конкретной команды.
  • Громадное количество (177 в zsh-5.2) опций, изменяющих поведение zsh. С их помощью можно, например, изменять поддерживаемый синтаксис и включать (в т.ч. частично) режимы совместимости с sh/bash/ksh/csh. Они позволяют настолько значительно влиять на работу, что в zsh пришлось сделать отдельный "режим совместимости с zsh", который многие функции обычно включают первой командой, потому что только это даёт им гарантию, что код этой функции будет понят zsh именно так, как ожидал его автор.
  • Предпочтение максимально сжатого, краткого синтаксиса — чтобы вам нужно было набирать как можно меньше текста для выполнения типичных, пусть даже довольно сложных, задач. В коде, где важна читабельность через месяц — это однозначно минус. Но в командной строке — однозначно плюс.
  • Модульная организация настроек через фреймворки (вроде oh-my-zsh и prezto), плагины, темы, etc. На самом деле здесь нет ничего специфичного для zsh, ровно то же самое можно сделать и для bash, но… почему-то для zsh всё это уже есть, а для bash — нет (а если и есть, то про это мало кто знает). А это даёт возможность относительно быстро собрать свой вариант настроек zsh из готовых "кубиков" (как пример, посмотрите видео менеджера плагинов zsh Аntigen), точно так же, как обвешивается плагинами Vim.

Отличия и совместимость

Ещё раз уточню, что я буду описывать именно отличия от bash, а не полный набор возможностей zsh. Большая часть привычного вам функционала работает в zsh точно так же, как и в bash. Но при этом часто есть специфичные для zsh способы делать примерно то же самое. Это связано с тем, что в zsh уделяется очень много внимания совместимости с другими шеллами, поэтому в zsh плюс к своим фичам перетащили очень многое из других шеллов — и в результате получили несколько альтернативных способов делать одно и то же.

Термины

Текущие настройки

Многие встроенные команды выводят текущее состояние при запуске без аргументов (плюс нередко у них есть аргумент, который оформляет вывод в стиле команд zsh, что довольно удобно).

Это далеко не полный список, но для большинства задач в процессе (анализа) настройки zsh его должно хватить.

Ещё может быть полезным запуск zsh -f — это запускает zsh в состоянии по умолчанию (без выполнения любых стартовых скриптов кроме /etc/zshenv , которого в большинстве систем и так нет).

setopt и emulate

  • В именах опций регистр и подчёркивания значения не имеют, плюс перед любой опцией можно добавить префикс "no".
  • Вызов для одной и той же опции setopt с префиксом "no" и unsetopt без "no" (равно как и наоборот!) делают одно и то же.
  • В выводе setopt используются маленькие буквы без подчёркиваний, в документации используются большие буквы с подчёркиваниями. Это создаёт некоторое неудобство — при поиске в документации нужно догадаться, где вставлять подчёркивания чтобы найти нужную опцию.
  • Команда emulate позволяет массово установить группу опций в состояние совместимости с sh, ksh, csh или в состояние по умолчанию для zsh. Многие функции в zsh начинаются командой emulate -L zsh , что позволяет на время выполнения функции привести ключевые опции в состояние по умолчанию для zsh — без этого большинство нетривиальных функций может ломаться из-за выставленных пользователем опций (например, есть опция которая управляет тем, как индексируются массивы — от 1 или от 0).

В начале использования zsh, для более привычной работы после bash, я бы рекомендовал следующие опции:

Ещё есть опция SH_WORD_SPLIT , и формально для привычной работы после bash её тоже надо включить, но я бы этого не рекомендовал: поведение zsh без этой опции более удобное и логичное, лучше сразу к нему привыкать. Она отвечает за то, как сработает cmd $PARAM если значение $PARAM это строка содержащая пробелы: в bash cmd получит несколько аргументов, а в zsh — один (как если бы вызвали cmd "$PARAM" ). А если $PARAM это массив, то zsh передаст cmd по одному аргументу на каждый не пустой элемент массива (даже если эти элементы содержат пробелы).

(В основном, эта статья описывает поведение zsh с опциями по умолчанию, иначе каждое второе предложение пришлось бы уточнять в стиле "но вот при таких-то опциях всё это работает иначе".)

Параметры

  • Соглашение: для имён скалярных параметров (строки, целые и дробные числа) обычно используют $БОЛЬШИЕ буквы, а для массивов (обычных и ассоциативных) — $маленькие .
  • Через typeset -U можно объявить массив с уникальными элементами (попытки добавления уже существующих элементов будут игнорироваться).
  • Через typeset -T можно связать массив со скаляром в формате $PATH . Несколько таких связанных параметров уже созданы: $PATH и $path , $FPATH и $fpath , $MANPATH и $manpath , $CDPATH и $cdpath . Для связанных параметров не имеет значения какой из них мы изменяем — изменяются сразу оба. Поэтому в zsh с такими параметрами практически всегда работают через массивы ( $path , $fpath , …) — это значительно удобнее.
  • Некоторые скалярные параметры так же связаны между собой, например $PS1 , $PROMPT и $prompt (хотя, это скорее просто синонимы для одного параметра).

Массивы

  • Индексируются с 1.
  • Можно использовать отрицательные индексы (от конца массива).
  • Можно использовать срезы.
  • При использовании как скаляра — объединяют элементы через пробел.
  • Индексирование скаляра возвращает символы строки.
  • Глоб возвращает массив, так что индекс можно использовать как квалификатор глоба: *([2,-2]) .

Шаблоны

Флаги/Квалификаторы/Модификаторы

Квалификаторы есть только у шаблонов, они позволяют задать дополнительные условия отбора файла: по типу (файл/каталог/симлинк/etc.), правам, времени (изменения/etc.), размеру… Можно сортировать и индексировать отобранные файлы. Можно включить для конкретно этого шаблона совпадение начальной * с именами начинающимися на точку. Можно включить удаление этого шаблона из аргументов командной строки если он не совпал ни с одним файлом.

Если включить опцию EXTENDED_GLOB , то в шаблонах можно будет использовать флаги: для файлов интерес представляет управление чувствительностью к регистру, а при совпадении с параметром/строкой есть и другие полезные флаги.

Для параметров доступно намного больше флагов: вывод всех (включая пустые) элементов массива даже в кавычках, выполнение join или split по заданной подстроке, вывод только ключей и/или значений ассоциативного массива, экранирование разными видами кавычек и обратная операция, etc.

И для шаблонов и для параметров можно использовать модификаторы: удаление последнего элемента пути, удаление всех элементов пути кроме последнего, удалить/оставить расширение, экранирование и обратная операция, поиск и замена подстроки, etc.

autoload -Uz

Помимо традиционного способа подгружать код через source /path/to/file.sh или . /path/to/file.sh в zsh активно используется автозагрузка кода в момент первого вызова функции.

Для поиска файла с нужной функцией используется $FPATH — переменная аналогичная по формату $PATH , содержащая список каталогов в которых выполняется поиск файла с именем, идентичным имени загружаемой функции.

При вызове autoload никаких файлов с диска не считывается, и даже не проверяется их наличие — всё это произойдёт при первом вызове функции. Практически всегда необходимо передавать autoload аргументы -U (отменяет эффект текущих alias-ов для загружаемого файла, потому что нередко alias-ы настроенные пользователем могут нарушать работу сторонних функций) и -z (необязательное уточнение что загружаемый файл — в формате zsh, но безопаснее его всегда задавать).

При этом содержимое файла

/my-zsh-functions/fn может быть в одном из этих трёх форматов:

При первом запуске zsh нередко оказывается, что часть кнопок вроде F1/Backspace/Delete/курсора работает некорректно. Это связано с тем, что абсолютное большинство консольных приложений использует readline и корректная настройка этих кнопок считывается из /etc/inputrc и

/.inputrc , а zsh этого не делает.

Проблема решается в лоб — нужно посмотреть, какие escape-последовательности выдают нужные кнопки в вашем терминале и задать в

/.zshrc нужные обработчики для этих escape-последовательностей. Примерно так:

Смотреть выдаваемые кнопками последовательности можно запустив cat >/dev/null и нажимая Ctrl-V перед нужной кнопкой. (И таки да, занимаясь этим в 2017 я чувствовал себя немного странно…) Но в комплекте с zsh идёт вспомогательная утилита zkbd , которая автоматизирует этот процесс. Для этого необходимо подключить её в

/.zshrc , после чего у вас появится ассоциативный массив $key содержащий нужные escape-последовательности:

Я не уточняю детально какие команды (вроде up-line-or-history ) на какие кнопки назначать потому, что во-первых назначать надо не все подряд, а только те, которые у вас из коробки не заработают, и во-вторых если мнения насчёт того, что должны делать Home или Backspace у всех сходятся, то вот поиск в истории по Up и Down может выполняться довольно разными способами, и функции в этих случаях на эти кнопки надо назначать тоже разные.

(Кстати, задавать символ Escape ( ^[ ) в параметре bindkey можно и настоящим символом, вводя его через Ctrl-V , и двумя обычными символами ^[ , и двумя символами \e .)

zstyle

Это встроенный способ использовать контекстно-зависимые настройки. Он во многом похож на обычные параметры, только помимо имени и значения параметра zstyle позволяет задать шаблон "контекста". А потом получать значения относящиеся к текущему контексту. Этот подход активно используется для настройки работы автодополнений, но им можно пользоваться и для своих скриптов.

zmodload

Часть дополнительного функционала zsh реализована не в обычных скриптах подгружаемых через autoload -Uz , а как системные библиотеки *.so . Они используются, например, для предоставления доступа к регулярным выражениям PCRE, математическим функциям, сокетам, etc. Такие библиотеки подгружаются через zmodload .

Разное

Для перехвата сигналов помимо стандартного trap '…;code;…' INT можно использовать функции с особыми именами: TRAPINT() < …;code;… >.

У многих конструкций вроде if , while , etc. есть сокращённая форма (пример есть выше, где выводилось значение всех режимов bindkey).

Внезапно, zsh-специфичный аналог echo — команда print — оказалась весьма удобной при изучении zsh. Она много чего умеет, но из самого полезного:

Если Когда решитесь переходить на zsh, то для принятия конкретных решений про фреймворки/модули/темы вам пригодится Awesome-коллекция всего для zsh.

Окно терминала на рабочем столе macOS Catalina.

В MacOS Catalina Apple теперь использует Zsh в качестве оболочки по умолчанию. Мы любим Zsh , но верная старая оболочка Bash все еще включена в macOS, и вы можете быстро переключиться обратно на Bash, если хотите.

Zsh является только оболочкой по умолчанию для вновь создаваемых учетных записей пользователей, поэтому любые существующие учетные записи на обновленном Mac будут по-прежнему использовать Bash, если вы не измените их. Каждая учетная запись пользователя имеет свои собственные настройки оболочки по умолчанию.

Из терминала

Чтобы изменить оболочку по умолчанию для учетной записи пользователя в macOS, просто запустите команду chsh -s (change shell) в окне терминала.

Измените оболочку по умолчанию на Bash, выполнив следующую команду:

Вам нужно будет ввести пароль своей учетной записи. Наконец, закройте окно терминала и снова откройте его. Вы будете использовать Bash вместо Zsh.

Изменение оболочки по умолчанию на Bash на MacOS Catalina.

Измените оболочку по умолчанию обратно на Zsh, выполнив эту команду:

Введите ваш пароль при появлении запроса. После того, как вы закроете окно терминала и снова откроете его, вы будете использовать Zsh.

Изменение оболочки по умолчанию на Zsh в macOS Catalina.

Вы можете увидеть список включенных оболочек, которые вы можете выбрать, выполнив следующую команду:

Список доступных оболочек в macOS терминале Каталины.

Из системных настроек

Вы также можете изменить эту опцию графически из системных настроек, если хотите.

Перейдите в Системные настройки> Пользователи и группы на вашем Mac. Нажмите на значок замка и введите свой пароль. Удерживая клавишу Ctrl, щелкните имя своей учетной записи на левой панели и выберите «Дополнительные параметры».

Открытие дополнительных параметров в «Пользователи и группы» в macOS.

Щелкните раскрывающийся список «Оболочка входа в систему» ​​и выберите «/ bin / bash», чтобы использовать Bash в качестве оболочки по умолчанию, или «/ bin / zsh», чтобы использовать Zsh в качестве оболочки по умолчанию. Нажмите «ОК», чтобы сохранить изменения.

Изменение графической оболочки по умолчанию в MacOS Catalina.

Bash на macOS все еще устарел

Обратите внимание, что версия Bash (Bourne Again SHell), включенная в macOS, все еще довольно устарела. Если вы запустите bash --version , вы увидите, что Catalina включает Bash 3.2.57, когда Bash 5.0 является последней версией. Более новые версии лицензируются под лицензией GPLv3, в то время как Apple все еще распространяет версию, лицензированную под GPLv2.

Напротив, версия Zsh (оболочка Z), включенная в macOS (проверьте с помощью zsh --version ), является Zsh 5.7.2, которая является последней версией на момент выпуска Catalina.

Просмотр версий Bash и Zsh на macOS Каталина.

Если вам нужна последняя версия Bash, вы можете установить ее самостоятельно через Homebrew .

Так что я учусь разрабатывать в Rails и открываю для себя силу Zsh. Однако для некоторых других моих задач я хочу использовать обычный Bash. Хотя они одинаковы, я просто чувствую себя комфортно в некоторых ситуациях. Как переключаться туда-сюда или включать и выключать zsh? Спасибо!

Вы можете просто использовать exec для замены текущей оболочки на новую:

Переключиться на bash :

Переключиться на zsh :

Это не повлияет на новые окна терминала или что-то еще, но это удобно.

Пожалуйста! Если вы удовлетворены этим ответом, отметьте его как принятый, отметив галочкой слева от ответа. Спасибо! Или просто вызовите zsh, и когда вы закончите, exit вернитесь к bash. Исполнение кажется ненужным и нежелательным. Все зависит от того, что вы ожидаете от окна вашего терминала при выходе. Я считаю, что начинать подоболочку самому не нужно и нежелательно. Как вы меняете настройки по умолчанию? Кроме того, когда я выполняю "exec bash" в zsh, он не получает исходный файл bash_profile. Есть моменты, когда я хочу использовать zsh, и другие моменты, когда это мешает тому, что я хочу сделать. Установка значения по умолчанию туда и обратно - плохая идея, так что это идеальное решение . престижность !!

Вы можете попробовать chsh -s /bin/bash установить bash по умолчанию или chsh -s /bin/zsh установить zsh по умолчанию.

Я часто переключаюсь между zsh и bash. Некоторое время я использовал исходный код моего bash_profile при каждом переключении. Тогда я узнал, что вы можете (как правило) сделать

Спасибо, Филл, я установил мыслитель / ноутбук, и он испортил все мои настройки. Ваш совет помогает вернуть мою среду в bash. Было бы полезно, если бы вы написали, для чего нужен «--login»? Make bash act as if it had been invoked as a login shell (see INVOCATION below). Источник

если это просто временный выключатель

Вы можете использовать exec, как указано выше, но для более постоянного решения.

Вы можете использовать chsh -s / bin / bash (для переключения на bash) и chsh -s / bin / zsh (для переключения на zsh)

Для Bash, попробуйте

Для зш попробуйте

У zsh есть встроенная команда, emulate которая может эмулировать различные оболочки, устанавливая соответствующие параметры, хотя csh никогда не будет полностью эмулироваться.

Флаг -R восстанавливает все параметры до значений по умолчанию для этой оболочки.

Не ясно, какую версию bash он будет эмулировать, будет ли он эмулировать bash 4.x? или 5.х?

Вы должны иметь возможность просто ввести bash в терминал, чтобы переключиться на bash, а затем набрать, zsh чтобы переключиться на zsh. У меня работает как минимум.

Это работает, но каждый раз, когда вы печатаете zsh или bash входите в под-оболочку (подпроцесс под текущей оболочкой). Вам нужно будет несколько раз ввести команду exit, чтобы вернуться к самой верхней оболочке.

В Mac OS Catalina по умолчанию используется интерактивная оболочка zsh. Чтобы изменить shell на zsh из bash:

Затем вам нужно ввести пароль Mac. Выйдите из терминала и снова откройте его. Чтобы проверить, успешно ли он изменился на ssh, введите следующую команду.

Если результат - / bin / zsh, ваша задача выполнена.

Чтобы изменить его обратно на bash, выполните следующую команду на терминале.

Проверьте это снова, используя echo $SHELL . Тогда результат должен быть / bin / bash.

Если у вас OS X, поставьте iTerm2, он лучше стандартного Terminal.app. Если у вас Linux, то у вас наверняка уже есть неплохой терминал, или вы можете самостоятельно поставить любой, который вам нравится. Я вот люблю Sakura. Ещё я обычно меняю цветовую схему. Стандартные чёрные мне не очень нравятся, есть крутая схема Solarized. Как её устанавливать тоже зависит от вашего терминала.

Теперь настроим непосредственно шелл. Шелл — это оболочка, в которой выполняются команды. Он показывает вам так называемое приглашение, оно обычно состоит из имени пользователя, имени компьютера и пути к тому месту, где вы сейчас находитесь. И выполняет команды, которые вы в него вводите. Стандартный шелл выглядит так:

Стандартное приглашение в шелле

Стандартное приглашение в шелле

Скучновато, правда? Первое, что мы сделаем — сменим оболочку с bash на zsh. Bash — это стандартная оболочка, которая поставляется в комплекте большинства систем. Zsh — это более современная оболочка со множеством плюшек. По сравнению с bash улучшены автодополнение, алиасы, хоткеи. Всё, что может bash, zsh может тоже, так что не вижу причин не переходить. У пользователей OS X zsh уже есть на компьютере, а пользователям Linux, скорее всего, нужно его установить. В Ubuntu и Debian это делается просто:

Установка zsh в Ubuntu и Debian

Установка zsh в Ubuntu и Debian

Пользователи остальных систем наверняка справятся с установкой. Теперь нужно сделать, чтобы zsh был вашей оболочкой по умолчанию, то есть использовался каждый раз, когда вы открываете терминал. Для этого есть команда chsh (change shell):

Ввод пароля при смене шелла

Ввод пароля при смене шелла

Смена оболочки по умолчанию

Смена оболочки по умолчанию

Приветствие от zsh

Приветствие от zsh

Мы, ничего не делая, выйдем (нажмём q ), потому что знаем секрет. Секрет в том, что не нужно писать длинный конфиг, если вы новый пользователь: частые проблемы и хотелки уже решили другие, и родилась такая замечательная штука — Oh My ZSH. Это набор плагинов и настроек, которые решают самые популярные задачи и делают ваш шелл просто офигенным. Установим его, следуя инструкциям с официального сайта:

Установка прошла, но ничего не поменялось? Надо закрыть терминал и снова открыть его, чтобы настройки, которые приехали к нам из oh-my-zsh, прочитались и применились. Закрыли-открыли, теперь видим новое приветствие:

Приветствие шелла после установки Oh My ZSH!

Приветствие шелла после установки Oh My ZSH!

Это стандартная тема oh-my-zsh под названием robbyrussell (по имени автора). Мы можем поставить любую из тем, которые поставляются с oh-my-zsh. Я, например, использую Bureau, когда-то я её писала, потому что не нашла подходящей. Чтобы поменять тему, напишите её название (маленькими буквами, как на странице со списком тем) в файле .zshrc . Он лежит в вашей домашней папке ( /Users/Ваш_логин или /home/ваш_логин ). Поскольку он начинается с точки, он скрыт. Включите отображение скрытых файлов. Тему нужно прописать в переменную ZSH_THEME , это в районе восьмой строки, вот так:

Меняем тему в конфиге с помощью переменной ZSH_THEME

Меняем тему в конфиге с помощью переменной ZSH_THEME

Сохраните файл и снова перезапустите терминал (или откройте в нём новую вкладку). Теперь шелл выглядит по-новому:

Тема Bureau в шелле

Тема Bureau в шелле

Это тема Bureau. В верхней строчке сначала имя пользователя, потом имя машины, потом путь к папке, где пользователь сейчас находится. Справа текущее время. В следующей строке просто символы, которые обозначают, что ввод здесь, а справа после шестиугольника текущая версия Node.js, ветка Git (если пользователь сейчас в Git-репозитории), и кружочки, которые обозначают, что есть несохранённые изменения. В этой теме версия Node.js показывается только если вы используете Node Version Manager.

Тема Agnoster в шелле

Тема Agnoster в шелле

А это тема Лёши, можете её взять из github и сохранить в папке

/.oh-my-zsh/themes , или установить простой командой:

Не забудьте прописать тему meritt в вашем файле .zshrc .

Да и вообще, полистайте список тем и выберите ту, которая вам по душе. Или склейте свою из кусочков понравившихся тем, или даже напишите с нуля! Все темы лежат в папке

/.oh-my-zsh/themes . Делитесь вашими темами: выкладывайте скриншоты и ссылки на файлы тем.

Читайте также: