LINUX.ORG.RU

Настраиваем и используем ZSH вместо Bash, или превращаем терминал в раскраску

 , ,

Настраиваем и используем ZSH вместо Bash, или превращаем терминал в раскраску

7

4

Я не буду расписывать преимущества ZSH над Bash, отмечу лишь то, что ZSH используется по дефолту во многих дистрибутивах Linux, а также с недавних пор и в macOS (тут должна быть шутка про Торвальдса и его макбук). Главной причиной повсеместной замены bash на zsh является встроенный механизм модулей, поверх которого было навалено такое великолепие, как Oh My Zsh.

Установка:

# В арчеподобных дистрах:
pacman -S zsh

# В дебианоподобных:
apt install zsh

Теперь нужно сделать zsh дефолтным шеллом:

chsh -s $(which zsh)

Главный конфиг zsh называется .zshrc, там можно, например, объявить пользовательские переменные окружения, но они будут доступны ТОЛЬКО В СЕССИИ ТЕРМИНАЛА. Чтобы они были доступны «везде», их нужно прописать в ~/.zshenv.

Кучу дотфайлов не очень удобно хранить в пользовательской директории, поэтому все конфиги лучше вынести в ~/.config/zsh.

Создадим директорию для конфигов zsh:

mkdir -p ~/.config/zsh

Теперь настроим переменные окружения

~/.zshenv:

# Для начала зададим переменные xdg, если те не заданы
# Эти переменные используются многими программами, и если их не задать, то пользовательская директория будет завалена файлами с точкой в начале имени 
# https://wiki.archlinux.org/title/XDG_Base_Directory
export XDG_DATA_HOME="${XDG_DATA_HOME:-$HOME/.local/share}"
export XDG_STATE_HOME="${XDG_STATE_HOME:-$HOME/.local/state}"
export XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"
export XDG_CACHE_HOME="${XDG_CACHE_HOME:-$HOME/.cache}"

# Далее определим эту переменную, чтобы конфиги zsh искались в этой директории
export ZDOTDIR="${XDG_CONFIG_HOME}/zsh"

# Так же добавим пути до бинарников в домашнем каталоге в PATH
# и переместим .zfunc из домашней директории в $ZDOTDIR
typeset -U path fpath
path=(~/.local/bin ~/bin $path)
fpath+=("$ZDOTDIR/.zfunc")

Остальные переменные добавьте по желанию (которые должны быть доступны в программах типа VS Code и т.п., если те запускаются не из терминала).

❗❗❗ После изменения ~/.zshenv нужно сделать логаут и снова войти под тем же пользователем.

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

Установка в Arch:

yay -S zsh-antidote

В остальных дистрах потребуется немного ручной работы:

git clone --depth=1 https://github.com/mattmc3/antidote.git ${ZDOTDIR:-~}/.antidote

Теперь перейдем к настройке главного конфига.

~/.config/zsh/.zshrc:

# Зададим путь до директории с плагинами Oh My Zsh
export ZSH="${ZDOTDIR}/oh-my-zsh"

# Вставка \ перед ? и тп
# Меня лично это бесит
DISABLE_MAGIC_FUNCTIONS=true

# Здесь подключается antidote

# Если antidote установлен через пакетный менеджер, то путь до него будет выглядеть примерно так
antidote_zsh='/usr/share/zsh-antidote.zsh'

# Если antidote был скачен через git, иначе закомментируйте следующую строку
antidote_zsh="$ZDOTDIR/.antidote/antidote.zsh"

if [ -f "$antidote_zsh" ]; then
  zsh_plugins=${ZDOTDIR:-$HOME}/.zsh_plugins
  if [[ ! ${zsh_plugins}.zsh -nt ${zsh_plugins}.txt ]]; then
    (
      source "$antidote_zsh"
      antidote bundle <${zsh_plugins}.txt >${zsh_plugins}.zsh
    )
  fi
  source ${zsh_plugins}.zsh
fi

# Настройки истории
export HISTSIZE=100000
export SAVEHIST=100000

# Файл истории так же храним в ~/.config/zsh
export HISTFILE=$ZDOTDIR/.zsh_history

# Всякие алиасы я предпочитаю хранить как файлы с расширением `.zsh` в ~/.config/zsh/zshrc.d

# Тут мы создаем директорию, если ее нет
if [ ! -d "$ZDOTDIR/zshrc.d" ]; then
  mkdir -p "$ZDOTDIR/zshrc.d"
fi

# А тут: подключаем вспомогательные файлы
for src in $ZDOTDIR/zshrc.d/*.zsh; do
  . "$src"
done

Минимальный конфиг готов.

А теперь пришло время настраивать и устанавливать все игр… плагины.

Antidote настраивается через текстовый файл. Где с каждой строчки указываются модули/плагины, которые нужно использовать, предварительно выкачав. Например, если плагин находится на https://github.com/zdharma-continuum/fast-syntax-highlighting, то мы указываем только часть после https://github.com/, те zdharma-continuum/fast-syntax-highlighting, если же плагин загружен на другой git-репозиторий исходного кода, то нужно добавить имя домена, например, gitlab.com/[username]/[reponame].

Создадим ~/.config/zsh/.zsh_plugins.txt:

# oh-my-zsh
# Подгрузим содержимое https://github.com/ohmyzsh/ohmyzsh/tree/master/lib
ohmyzsh/ohmyzsh path:lib

# Добавим какие-нибудь плагины
ohmyzsh/ohmyzsh path:plugins/colored-man-pages
ohmyzsh/ohmyzsh path:plugins/colorize
ohmyzsh/ohmyzsh path:plugins/command-not-found
ohmyzsh/ohmyzsh path:plugins/common-aliases

# мне еще нравится этот
# он позволяет добавить к текущей или предыдущей команде sudo, два раза нажав <ESC> 
ohmyzsh/ohmyzsh path:plugins/sudo

# этот плагин вставляет закрывающую кавычку или скобку при вводе открывающей...
hlissner/zsh-autopair

# уведомляет о том, что у команды есть алиас
MichaelAquilina/zsh-you-should-use

# подстановка ранее введеных команд
zsh-users/zsh-autosuggestions kind:defer

# автодополнение аргументов
zsh-users/zsh-completions kind:defer

# я обещал превратить терминал в раскраску...
# подсветка синтаксиса zsh (раскрашивание ключевых слов и прочих разделителей разными цветами)
zdharma-continuum/fast-syntax-highlighting kind:defer

# ну и поставим какую-нибудь тему
ohmyzsh/ohmyzsh path:themes/refined.zsh-theme

Скрины с темами можно посмотреть здесь.

Если не устраивают темы oh my zsh, то вот вам одна из самых популярных тем romkatv/powerlevel10k.

Осталось только перезапустить шелл:

exec -l $SHELL

Жду дополнений. Может, и для себя что-то новое узнаю.

Интересные плагины можно найти в репозитории Awesome ZSH Plugins.



Проверено: hobbit ()
Последнее исправление: rtxtxtrx (всего исправлений: 14)

Ответ на: комментарий от masa

круто. печатай дальше bash -c '<тут вставляем код>'

rtxtxtrx
() автор топика

Спасибо! Давно искал толковое описание про zsh. Надо бы мак донастроить.

gns ★★★★★
()
Ответ на: комментарий от gns

Это самое короткое решение к которому я пришел. Я начинал еще со всяких zplug (и еще что-то до него было), где нужно было как в vim’e портянки кода писать

rtxtxtrx
() автор топика
Ответ на: комментарий от rtxtxtrx

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

gns ★★★★★
()
Последнее исправление: gns (всего исправлений: 1)
Ответ на: комментарий от gns

Ну судя по клоунам и рукалицам, НЕконфигурируемое нечто (fish) и мнение о том, что менеджеры плагинов не нужны (мой дед через curl все плагины ставил, и я буду, ряяяяяяя!) так же очень популярны. Было бы интересно @anonymous_sapiens послушать, тот же @Clockwork, что нет ничего лучше термина по умолчанию.

rtxtxtrx
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от rtxtxtrx

Про fish слышал, какие-то восторженные маководы его хвалили, но вот чего мне точно не надо в жизни, это восторженных маководов. Не так страшен мак, как его поклонники :) Типа fish превратит ваш МАК в.... А во что он его превратит? Он уже и так мак. Вот никогда не понимал, зачем превращать мерседесы в брабусы. Он же и так уже мерседес!

Я глянул на это цветастое нечто на картинках у них на сайте и мне стало страшно. Я не понял, зачем мне оно.

gns ★★★★★
()
Ответ на: комментарий от rtxtxtrx

Потому что это хороший способ обмазаться говнокодом и получить тормоза на ровном месте. Много тормозов. При том, что оно ничего не даёт взамен.

Clockwork ★★★★★
()
Ответ на: комментарий от gns

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

rtxtxtrx
() автор топика
Ответ на: комментарий от rtxtxtrx

Не, свой синтаксис — это отставить. Я не один на свете живу. Скрипты должны у всех запускаться. В продакшене вообще по хорошему надо /bin/sh в после шебанга писать :)

gns ★★★★★
()
Ответ на: комментарий от gns

Надо /bin/bash писать. В зависимости от дистра /bin/sh может башем или dash’em (на основе debian - точно) быть у них тоже различия в синтаксисе.

rtxtxtrx
() автор топика
Ответ на: комментарий от rtxtxtrx

Не надо. Юниксов много. Тот же мак на борту баш имеет, но он, если и младше дерьма мамонтов, то не сильно. Чо там было в третьей версии да кто ж помнит-то?

А шеллы имеют привычку, если их позвали по хардлинку /bin/sh, притворяться честным борн-шеллом, насколько могут.

gns ★★★★★
()
Последнее исправление: gns (всего исправлений: 2)
Ответ на: комментарий от gns

res=`run_my_command…`

В shellcheck.net стоит ввести подобное в составе bash-скрипта, так начинает сыпать предупреждениями:

SC2006 (style): Use $(…) notation instead of legacy backticks `…`

SC2006

krasnh ★★★★
()
Ответ на: комментарий от krasnh

Ну вот я подозревал что-то подобное. Но если у тебя внутри обратных кавычек еще пара обратных кавычек (и не только обратных), то все это эскейпить упаришься. Читать это все будет невозможно. И писать тоже.

gns ★★★★★
()
Ответ на: комментарий от gns

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

"$(cmd "arg")"
rtxtxtrx
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

Ну, блин, скоро в скриптах у них препроцессор появится на тему IF $bash_version -lt <какой-то>

gns ★★★★★
()
Ответ на: комментарий от masa

Давай покормлю: а вот есть ли в fish что-то типа fzf-tab с автоподстановкой имен команд, используя нечеткий поиск (полезно когда не помнишь точное имя команды)?

rtxtxtrx
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 1)
Ответ на: комментарий от rtxtxtrx

Это ошибка устаревшего синтаксиса, который может не поддерживаться в новых версиях баш.

В какой версии баша не поддерживаются бэктики? Что вообще значит «может»? По пятницам? Кто объявил этот синтаксис устаревшим? Что происходит?

vbr ★★★★
()
Ответ на: комментарий от rtxtxtrx

Что-то подобное есть:

me@home ~> ess
accessdb                  (command)  gnome-session-quit   (command)  pamsharpness            (command)
bzless               (command link)  grub-macbless        (command)  progress                (command)
clickhouse-compressor     (command)  hoichess             (command)  session-migration       (command)
containerd-stress         (command)  less                 (command)  sessreg                 (command)
dbus-run-session          (command)  lessecho             (command)  uncompress              (command)
debconf-apt-progress      (command)  lessfile        (command link)  user-session-migration  (command)
driverless           (command link)  lesskey              (command)  word-list-compress      (command)
driverless-fax       (command link)  lesspipe             (command)  xmessage                (command)
encguess                  (command)  llvm-stress     (command link)  xzless                  (command)
gnome-chess               (command)  llvm-stress-18  (command link)  x-session-manager  (command link)
gnome-session             (command)  loimpress            (command)  zless                   (command)
gnome-session-inhibit     (command)  lzless          (command link)  zstdless                (command)
gnome-session-properties  (command)  mscompress           (command)  
masa
()
Ответ на: комментарий от masa

Это не нечеткий поиск. Те модификация конфига в шапке:

.zsh_plugins.txt

Aloxaf/fzf-tab
cat <<'EOF' >$ZDOTDIR/zshrc.d/fzf-tab-config.zsh 
# disable sort when completing `git checkout`
zstyle ':completion:*:git-checkout:*' sort false
# set descriptions format to enable group support
# NOTE: don't use escape sequences here, fzf-tab will ignore them
zstyle ':completion:*:descriptions' format '[%d]'
# set list-colors to enable filename colorizing
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
# force zsh not to show completion menu, which allows fzf-tab to capture the unambiguous prefix
zstyle ':completion:*' menu no
# preview directory's content with eza when completing cd
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'eza -1 --color=always $realpath'
# switch group using `<` and `>`
zstyle ':fzf-tab:*' switch-group '<' '>'
EOF
exec -l "$SHELL"

…делит на ноль преимущества твоей любимой оболочки? А у zsh еще куча плагинов, так что тролли, которые ставят клоунов сами таковыми являются ибо не разбираются в теме, епта. Даже в GayOS более вменяемые разрабы, поэтому zsh там был выбран по дефолту из-за возможностей кастомизации, хотя среди маководов любителей этой селедки море

rtxtxtrx
() автор топика
Последнее исправление: rtxtxtrx (всего исправлений: 2)
Ответ на: комментарий от rtxtxtrx

Даже в GayOS более вменяемые разрабы, поэтому zsh там был выбран по дефолту из-за возможностей кастомизации, хотя среди маководов любителей этой селедки море

К сожалению, это не так.

gleb@macpro loader % bash --version
GNU bash, version 3.2.57(1)-release (arm64-apple-darwin23)
Copyright (C) 2007 Free Software Foundation, Inc.
gleb@macpro loader % 

Баш на борту есть, но он там древний. Я слышал такую теорию, что случился конфликт лицензий, и более новые баши на макось тащить не стали. Ну и выбрали наиболее вменяемый шелл из оставшихся.

И да, слоган «fish — лучший шелл для вашего мака» мне попадался.

gns ★★★★★
()

Может, и для себя что-то новое узнаю.

  1. про zsh есть только «Learning Shell Scripting with Zsh» (Gastón Festari); книг о bash – десятки (вероятно я динозавр?)

  2. необходимость после старта настраивать клавиши home/end/pageUp/pageDown/arrow keys в 2024м несколько странно выглядит.

  3. раскраска видима только на тёмном фоне.

tt
()
Ответ на: комментарий от tt

Ее можно не читать после:

sudo apt-get install zsh

Лишь в самом конце кратко написано как свои модули создать и completions добавить.

rtxtxtrx
() автор топика

Будет время глянь manjaro kde, похоже zsh можно на свалку истории, ) bash наступает на пятки.

Сейчас глянул manjaro kde, так там bash (echo $SHELL) настроенный как zsh - автодополнение по TAB с перебором команд, подстановка из истории, prompt красивый… Немножко охренел, конечно.

Могут же настроить bash удобно, когда захотят.
Поясните про swap (комментарий)

krasnh ★★★★
()
Последнее исправление: krasnh (всего исправлений: 1)
Ответ на: комментарий от krasnh

Да, там в $HOME лежат файлы относящиеся к zsh. Ввело в заблуждение echo $SHELL.

krasnh ★★★★
()
Для того чтобы оставить комментарий войдите или зарегистрируйтесь.