fish (Русский)
fish (friendly interactive shell, т.е. дружелюбная интерактивная оболочка) представляет собой удобную интерактивную оболочку командной строки предназначенную в основном для интерактивного использования.
Установка
Установите пакет fish из официальных репозиториев. Либо установите fish-gitAUR версию пакета для разработки.
Для того чтобы сделать fish оболочкой по умолчанию, выполните chsh -s /usr/bin/fish
.
Ввод/Вывод
Файловые дескрипторы
Как и другие оболочки fish позволяет перенаправлять потоки ввода/вывода. Это полезно при использовании текстовых файлов для сохранения вывода программы или ошибок, или при использовании текстовых файлов в качестве входных данных. Большинство программ использует три входных/выходных потока, представленные набором номеров файловых дескрипторов (file descriptors (FD)). Это:
- Стандартный ввод (FD 0), используется для чтения (клавиатуры по умолчанию).
- Стандартный вывод (FD 1), используется для записи (экран по умолчанию).
- Стандартная ошибка (FD 2), используется для отображения ошибок и предупреждений (экран по умолчанию).
Перенаправление
Любой файловый дескриптор может быть перенаправлен в другой файл механизмом называемым перенаправлением:
Перенаправление стандартного ввода: $ команда < исходный файл Перенаправление стандартного вывода: $ команда > назначение Добавление стандартного вывода в существующий файл: $ команда >> назначение Перенаправление стандартной ошибки: $ команда ^ назначение Добавить стандартную ошибку в существующий файл: $ команда ^^ назначение
Вы можете использовать один из следующих назначений
:
- Имя файла (выход будет записан в указанный файл).
-
&
за которым следует номер другого дескриптора файла. Выход будет написан на другой файловый дескриптор. -
&
с последующим знаком-
. Выход не будет записан.
Примеры:
Перенаправление стандартного выхода в файл: $ команда > файл_назначения.txt Перенаправление стандартного вывода и стандартной ошибки в тот же файл: $ команда > файл_назначения.txt ^ &1 Отключение стандартного вывода: $ команда > &-
Пайпинг (piping)
Вы можете перенаправить стандартный вывод одной команды на стандартный ввод следующей команды. Это делается путем разделения команд вертикальной чертой (|
). Пример:
cat example.txt | head
Вы можете перенаправить другие файловые дескрипторы пайпингом (кроме стандартного вывода). Следующий пример показывает, как использовать стандартную ошибку из одной команды в качестве стандартного ввода другой команды, передавая номер файлового дескриптора стандартной ошибки в пайп >
:
$ команда 2>| less
Это выполнит команда
и перенаправить его стандартную ошибку в less
.
Настройка
~/.config/fish/config.fish
это Файл пользовательских настроек fish. Добавьте команды или функции в файл, и он будет выполнять/определять их, когда откроете терминал. Похож на .bashrc
.
Веб-интерфейс
The fish prompt and terminal colors can be set with the interactive web interface:
fish_config
Selected settings are written to your personal configuration file. You can also view defined functions and your history.
Приглашение командной строки (Prompt)
Если хотите чтобы fish отображал "branch" и "dirty status" когда находитесь в git каталоге, добавьте следующую строку в ваш ~/.config/fish/config.fish
:
# fish git prompt set __fish_git_prompt_showdirtystate 'yes' set __fish_git_prompt_showstashstate 'yes' set __fish_git_prompt_showupstream 'yes' set __fish_git_prompt_color_branch yellow # Status Chars set __fish_git_prompt_char_dirtystate '⚡' set __fish_git_prompt_char_stagedstate '→' set __fish_git_prompt_char_stashstate '↩' set __fish_git_prompt_char_upstream_ahead '↑' set __fish_git_prompt_char_upstream_behind '↓' function fish_prompt set last_status $status set_color $fish_color_cwd printf '%s' (prompt_pwd) set_color normal printf '%s ' (__fish_git_prompt) set_color normal end
Завершение команд
fish может генерировать автодополнение из страниц руководства man. Completions are written to ~/.config/fish/generated_completions/
and can be generated by calling:
fish_update_completions
You can also define your own completions in ~/.config/fish/completions/
. See /usr/share/fish/completions/
for a few examples.
Context-aware completions for Arch Linux-specific commands like pacman, pacman-key, makepkg, cower, pbget, pacmatic are built into fish, since the policy of the fish development is to include all the existent completions in the upstream tarball. The memory management is clever enough to avoid any negative impact on resources.
Совмещение /etc/profile и ~/.profile
Стандартный POSIX sh
не совместим с fish, fish не может взять исходник /etc/profile
(и, таким образом, все *.sh
в /etc/profile.d
) и ~/.profile
Если вы хотите чтобы fish брал файлы-исходники, установите dash и добавьте следующую строку в ваш config.fish
:
env -i HOME=$HOME dash -l -c printenv | sed -e '/PATH/s/:/ /g;s/=/ /;s/^/set -x /' | source
Альтернативный вариант позволит вам сэкономить один исполняемый вызов с помощью встроенной команды:
env -i HOME=$HOME dash -l -c 'export -p' | sed -e "/PATH/s/'//g;/PATH/s/:/ /g;s/=/ /;s/^export/set -x/" | source
Советы и рекомендации
История Замены
Fish does not implement history substitution (e.g. sudo !!
), and the fish developers have said that they do not plan to. Still, this is an essential piece of many users' workflow. Reddit user, crossroads1112, created a function that regains some of the functionality of history substitution and with another syntax. The function is on github[устаревшая ссылка 2020-08-02] and instructions are included as comments in it. There is a forked version that is closer to the original syntax and allows for command !!
if you specify the command in the helper function.
Хук "command not found"
pkgfile включает хук "command not found" ("команда не найдена"), который при вводе неизвестной команды осуществляет поиск в официальных репозиториях. Если пакет pkgfile установлен, хук запустится по умолчанию.
Решение проблем
Скрипты не совместимые с fish
В Arch, некоторые скрипты написаны для Bash, и они не полностью совместимы с fish. Вы можете получатьошибки вскриптах, если ваша оболочка по умолчанию устанавливается как fish. В Arch есть много сценариев оболочки (shell scripts), написанных для Bash, и они небыли переведены для fish. Чтобы не устанавливать Fish оболочкой по умолчанию, самым лучшим вариантом будет открыть эмулятор терминала с возможностью командной строки fish. Для большинства терминалов это параметр -e
, так например, чтобы открыть gnome-terminal, использующим fish, измените свой ярлык для использования:
gnome-terminal -e fish
С LilyTerm и другими легкими эмуляторами терминалов, которые не поддерживают заданную оболочку, команда будет выглядеть следующим образом:
SHELL=/usr/bin/fish lilyterm
Другой вариант: установить fish в качестве оболочки по умолчанию для терминала в настройках терминала или его профиле, - конечно если ваш эмулятор терминала поддерживает это. This is contrast to changing the default shell for the user which would cause the above mentioned problem.
Чтобы установить fish, как оболочку в tmux, установите это в вашем ~/.tmux.conf
:
set-option -g default-shell "/usr/bin/fish"
Not setting fish as system wide default allows the arch scripts to run on startup, ensure the environment variables are set correctly, and generally reduces the issues associated with using a non-Bash compatible terminal like fish.
If you decide to set fish as your default shell, you may find that you no longer have very much in your path.
You can add a section to your ~/.config/fish/config.fish
file that will set your path correctly on login. This is much like .profile
or .bash_profile
as it is only executed for login shells.
if status --is-login set PATH $PATH /usr/bin /sbin end
Обратите внимание, что вам нужно будет вручную добавлять различные другие переменные окружения, такие как $MOZ_PLUGIN_PATH
. Это огромный объем работы, чтобы получить удобство работы с fish в качестве оболочки по умолчанию.
su запускает Bash
Если su запускается с Bash (потому что Bash оболочка по умолчания), определите функцию в fish:
$ funced su function su /bin/su --shell=/usr/bin/fish $argv end $ funcsave su
Запуск X при входе в систему
Добавьте следующее в нижнюю часть ~/.config/fish/config.fish
.
# start X at login if status --is-login if test -z "$DISPLAY" -a $XDG_VTNR -eq 1 exec startx -- -keeptty end end
startx
требует -keeptty
Флаг при использовании fish.Смотрите также
- https://fishshell.com/ - Домашняя страница
- https://fishshell.com/docs/2.1/index.html - Документация