---
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/