--- title: Fish or Zsh tags: programming, linux, work --- # Выбор shell'а, для повседнегного использования В данном тексте я рассмотрю проблему выбора средства, которое позволяет упростить повседневные задачи программиста. Речь пойдет о так наываемых shell'ах. Я расскажу какие средства я использую, почему, немного расскажу про самую близкую альтернативу и то, почему мне понравилось то, что понравилось :smile: :::info Текст будет очень opinionated, поэтому не прошу принимать все близко к сердцу плюс я не считаю себя супер продвинутым пользователем, т.е. потребляю возможности этого ПО на обычном уровне (скорее даже поверхностно) ::: ## Что это вообще такое? Мы все часто пользуемся терминалом по долгу своей работы. надо быстро что-то поправить, почитать, проверить, пройтись по файлам - часто эту работу удобнее сделать именно в нем, чем как-то иначе. Поэтому обычно, когда пользователь начинает проводить больше времени в терминале - он задается вопросом: "Как мне проводить мое время полезнее, чем я это делаю сейчас?". После некоторого времени поисков, пользователь найдет альтернативы...И этими альтернативами будут различные shell'ы. ## Какие есть альтернативы? Альтернатив довольно много: - bash (это исходный вариант, он не всегда работает плохо) - csh - fish - zsh - python :sweat_smile: Это далеко не все варианты. Я рассмотрю два пункта: **fish**, **zsh**. Потому, что от **bash** мы уходим, **csh** в основном для программирования скриптов, а **python** - с ним и так все понятно :smile: ## Установка Установка будет рассмотрена на примере *Ubuntu 19.10*. ### [fish](https://fishshell.com/) Установка этой утилиты максимально проста. ```bash sudo apt-add-repository ppa:fish-shell/release-3 sudo apt-get update sudo apt-get install fish ``` Все, все установлено. Далее либо просто вводим **fish** и пользуемся, либо меняет **shell** по умолчанию. ```bash chsh -s /usr/local/bin/fish ``` :::info Инструкцию для других ОС можно посмотреть на их странице в [GitHub (тык)](https://github.com/fish-shell/fish-shell) ::: ### zsh ([oh, my zsh](https://github.com/ohmyzsh/ohmyzsh)) **Oh, my zsh** - эт оне мое восклицание от того, что он мне нравится. Это название надстройки над **zsh**, которая позволяет рабоатт ьс ним более удобно. Сначала ставим **zsh** ```bash sudo apt install zsh ``` Затем ``` sh -c "$(wget -O- https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)" ``` Почитать об установке можно здесь: [GitHub](https://github.com/ohmyzsh/ohmyzsh) #### Какие выводы по установке? Обе утилиты ставятся протсо (на linux), никаких проблем возникать не должно. ## Конфигурация ### fish Конфигирацию **fish**, я не буду рассматривать, кину пару статей. Т.к. я им не пользуюсь. [Тык](https://habr.com/en/post/248881/) :::danger Мне она не нравится т.к. она не **POSIX** совместимая, т.е. она не может интерпретировать все скрипты с валидным **sh** (я мог где-то ошибиться, но это я так понял) ::: ### zsh Тут все довольно протсо, есть множество разных плагинов, тем + параметров в файле `.zshrc`. Сразу выкину свой пример файла `.zshrc` ```zsh # Path to your oh-my-zsh installation. export ZSH="/home/ilia/.oh-my-zsh" # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes ZSH_THEME="robbyrussell" # This option looks nice, but I'm not sure if I really need it. You can try =) # Uncomment the following line to enable command auto-correction. # ENABLE_CORRECTION="true" MAGIC_EQUAL_SUBST="true" # Add wisely, as too many plugins slow down shell startup. plugins=( docker docker-compose git git-flow git-extras dotenv command-not-found copyfile encode64 extract gradle httpie kubectl minikube mvn node npm pip pyenv python sdk tmux web-search zsh-autosuggestions virtualenv ) source $ZSH/oh-my-zsh.sh alias zshconfig="vim ~/.zshrc" alias ohmyzsh="vim ~/.oh-my-zsh" #THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR="/home/ilia/.sdkman" [[ -s "/home/ilia/.sdkman/bin/sdkman-init.sh" ]] && source "/home/ilia/.sdkman/bin/sdkman-init.sh" export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi [[ -s "/home/ilia/.gvm/scripts/gvm" ]] && source "/home/ilia/.gvm/scripts/gvm" ``` Так, теперь нао пояснить что я тут делаю... Сначала все остальное, кроме плагинов, потом они, а то их много :smile: #### Начало Тут у меня дефолтные настройки, тема мне нравится, плюс еще добавляю, чтобы параметры программ после `=` автокомлитело именами файлов из текущей папки, иногда удобно (опять же на вкус и цвет товарищей нет). ```zsh # Path to your oh-my-zsh installation. export ZSH="/home/ilia/.oh-my-zsh" # See https://github.com/ohmyzsh/ohmyzsh/wiki/Themes ZSH_THEME="robbyrussell" # This option looks nice, but I'm not sure if I really need it. You can try =) # Uncomment the following line to enable command auto-correction. # ENABLE_CORRECTION="true" MAGIC_EQUAL_SUBST="true" ``` #### Алиасы Не любитель я много алиасов делать, я потмо их забываю, тут 2 я оставил из дефолтного, чтобы было удобнее менять настройки. ```zsh alias zshconfig="vim ~/.zshrc" alias ohmyzsh="vim ~/.oh-my-zsh" ``` #### Настройка PATH Тут у меян настройка кучи разных интересных штук, которую не олучилось бы стделать так просто в **fish** так как она не POSIX совместика, как я уже упоминал. Тут я настрайваю **sdkman**. Штука чтобы удобно управлять утилитами *около Java & Java*. Советую посмротреть, если не видел :smiley:, [тыкай](https://sdkman.io/). Потом настрайваю **NVM** (Node Version Manager). Полезная штука, если пользуешься **Node.js**, мне иногда надо, так что ставлю обычно. [Тыкай](https://github.com/nvm-sh/nvm) Также есть утилита **GVM** (Go Version Manager). Мне **GoLang** Нарвится, больше бы времени чтобы на нем писать...А так понятно зачем штука, аналогия с **NVM**, [тыкай](https://github.com/moovweb/gvm) Еще тут есть **PyENV** (Тоже самое только для питона :smiley:). На нем пишу для себя, что-то автоматизирую, поэтому пользуюсь, удобно просто. ```zsh #THIS MUST BE AT THE END OF THE FILE FOR SDKMAN TO WORK!!! export SDKMAN_DIR="/home/ilia/.sdkman" [[ -s "/home/ilia/.sdkman/bin/sdkman-init.sh" ]] && source "/home/ilia/.sdkman/bin/sdkman-init.sh" export NVM_DIR="$HOME/.nvm" [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm [ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion" # This loads nvm bash_completion export PYENV_ROOT="$HOME/.pyenv" export PATH="$PYENV_ROOT/bin:$PATH" if command -v pyenv 1>/dev/null 2>&1; then eval "$(pyenv init -)" fi [[ -s "/home/ilia/.gvm/scripts/gvm" ]] && source "/home/ilia/.gvm/scripts/gvm" ``` ##### Плагины Пройдусь просто по очереди и буду кидат ьссылки на репы с ними, где можно подробнее глянуть. - [`docker`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#docker) Тут без коммментариев, добавляет поддержку автокомплита для **docker**. Оч удобно, т.к. автокомплитит все подряд, оч круто. - `docker-compose` Тоже крутое дополнение для **docker-compose**. - [`git`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#git) - [`git-flow`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#git-flow) - [`git-extras`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#git-extras) Это различные дополнения для **git**, в консоли становится работать приятнее чем обычно. - [`dotenv`](https://github.com/ohmyzsh/ohmyzsh/tree/master/plugins/dotenv) Тут делается так, что если у тебя в папочке есть файлик `.env`, то, когда ты в неё заходишь ,все переменные из него будут экспортироваться к тебе, что ну прям оч круто. - [`command-not-found`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#command-not-found) Если команды, что ты ввел нет - помогает её найти, либо установить. - [`copyfile`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#copyfile) Просто копирует файл в `clipboard`, что указал :smile: - [`encode64`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#encode64) Удобно кодировать им что-нибудь в base64. - [`extract`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#extract) Помогает удобно работать с архивами. - [`gradle`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#gradle) Тут все понятно, делает `gradle` удобнее :smile:. - [`httpie`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#httpie) `curl` для здоровых людей :smiley: - [`mvn`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#mvn) Также поддержка `maven`. - [`sdk`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#sdk) Поддрежка моего любимого `sdk`. - [`web-search`](https://github.com/ohmyzsh/ohmyzsh/wiki/Plugins#web-search) Позволяет гуглить прямо в терминале, Stack Overflow Development was taken on the next level :smile: - [`zsh-autosuggestions`](https://github.com/zsh-users/zsh-autosuggestions/blob/master/INSTALL.md) Вот этот плагин ставиться не как все, тут еще надо клонить репу, все равн оне сложно, но все-таки. Делает так, чтобы **zsh** выглядел как **fish** ## Заключение Я тут поделился тем, что использую + немного мыслей, надеюсь будет полезно, я не использую его на всю, но этого мне вообще достаточно, чтобы балдеть :smile: ###### tags: programming, linux, work, zsh, fish, shell ## Можешь почитать https://habr.com/en/post/326580/