Jump to content
From ArchWiki

Состояние перевода: На этой странице представлен перевод статьи fish. Дата последней синхронизации: 17 декабря 2022. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

Ссылки по теме

- Командная оболочка

fish (friendly interactive shell) — это удобная оболочка командной строки, предназначенная в основном для интерактивного использования.

fish намеренно не является полностью совместимой с POSIX, она нацелена на устранение неконсистентности POSIX (по мнению создателей) с помощью упрощённого или иного синтаксиса. Это означает, что даже простые POSIX-совместимые скрипты могут потребовать значительной адаптации или даже полного переписывания для работы с fish.

## Установка

Установите пакет fish. Разрабатываемая версия доступна в пакете fish-gitAUR.

После установки просто наберите `fish`, чтобы попасть в оболочку fish.

Команда `help` откроет документацию в веб-браузере. Рекомендуется прочитать хотя бы раздел «Syntax overview» на странице «The fish language», поскольку синтаксис fish отличается от многих других оболочек.

## Интеграция с системой

Решите, будет ли fish оболочкой пользователя по умолчанию, то есть запускаться сразу при входе в систему, или она будет запускаться вручную как дочерний процесс текущей оболочки по умолчанию (в качестве примера данная статья будет подразумевать, что оболочкой по умолчанию является Bash). Остановимся подробнее на этих двух установках:

- fish используется как оболочка по умолчанию: этот режим требует некоторого базового понимания функционирования fish и её скриптового языка. Текущие скрипты инициализации и переменные окружения пользователя должны быть перенесены в новое окружение fish. Чтобы настроить систему в этом режиме, выполните действия, описанные в разделе #Установка fish в качестве оболочки по умолчанию.
- fish используется только как интерактивная оболочка: все скрипты инициализации Bash запускаются как обычно, а fish работает поверх Bash в интерактивном режиме, подключенном к терминалу. Чтобы настроить fish в этом режиме, выполните шаги, описанные в разделе #Установка fish только в качестве интерактивной оболочки.

### Установка fish в качестве оболочки по умолчанию

Если вы решили сделать fish оболочкой по умолчанию, первым шагом будет установка оболочки этого конкретного пользователя на `/usr/bin/fish`. Необходимые шаги описаны в разделе Командная оболочка#Выбор оболочки по умолчанию.

Следующим шагом будет перенос необходимых действий и настроек, выполняемых в различных скриптах инициализации Bash, а именно `/etc/profile`, `~/.bash_profile`, `/etc/bash.bashrc` и `~/.bashrc`, во фреймворк fish.

В частности, содержимое переменной окружения `$PATH`, после непосредственного входа в fish, следует проверить и настроить под свои нужды. В fish `$PATH` определена как глобальная переменная окружения: она имеет глобальную область видимости для всех функций, теряется при перезагрузке и является переменной окружения, что означает, что она экспортируется в дочерние процессы. Рекомендуемый способ добавления дополнительных мест в path — вызов команды fish_add_path из `config.fish`. Например:

    $ fish_add_path -p /первый/путь /второй/путь /третий/путь

Указанные три пути будут добавлены в начало path.

### Установка fish только в качестве интерактивной оболочки

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

#### Запуск fish через .bashrc

Оставьте Bash оболочкой по умолчанию и просто добавьте строку `exec fish` в подходящий файл настроек Bash, например `.bashrc`. Это позволит Bash правильно выполнить source файла `/etc/profile` и всех файлов в `/etc/profile.d/`. Поскольку процесс Bash полностью заменяется на процесс fish, выход из fish также приведёт к выходу из терминала. По сравнению со следующими вариантами, это наиболее универсальное решение, поскольку оно работает как на локальной машине, так и на SSH-сервере.

Совет:

- При использовании такой установки используйте команду `bash --norc`, чтобы вручную войти в Bash без выполнения команд из `~/.bashrc`, который запустит `exec fish` и вернёт вас обратно в fish.
- Чтобы команды наподобие `bash -c 'echo test'` выполняли команду в Bash вместо запуска fish, можно написать `if [ -z "$BASH_EXECUTION_STRING" ]; then exec fish; fi` вместо простого exec.
- Можно настроить вход в fish только в том случае, если родительский процесс не является fish. Это позволяет быстро войти в bash, вызвав команду `bash`, без потери настроек из `~/.bashrc`:

    if [[ $(ps --no-header --pid=$PPID --format=comm) != "fish" && -z ${BASH_EXECUTION_STRING} ]]
    then
    	exec fish
    fi

#### Использование настроек эмулятора терминала

Другой вариант — запускать эмулятор терминала с параметром, запускающим fish. В большинстве терминалов для этого используется аргумент `-e`, поэтому, например, чтобы открыть gnome-terminal с запуском в нём fish, сделайте ярлык с такой командой:

    gnome-terminal -e fish

В эмуляторах терминала, которые не поддерживают установку оболочки, например, lilyterm-gitAUR, можно использовать другой способ:

    SHELL=/usr/bin/fish lilyterm

Также, в зависимости от терминала, вы можете установить fish в качестве оболочки по умолчанию либо в настройках, либо в профиле терминала.

#### Использование настроек терминального мультиплексора

Например, если вы используете tmux и хотите использовать в нём fish в качестве командной оболочки, добавьте следующее в файл `~/.tmux.conf`:

    set-option -g default-shell "/usr/bin/fish"

После этого при запуске tmux будет запускаться fish.

## Настройка

Файл настроек `~/.config/fish/config.fish` запускается при каждом входе. Добавление команд или функций в этот файл приводит к их выполнению/определению при открытии терминала, аналогично `.bashrc`. Обратите внимание, что если переменная должна быть сохранена, её следует установить как универсальную, а не определять в вышеупомянутом файле настроек.

Пользовательские функции находятся в каталоге `~/.config/fish/functions/` в файлах `имя_функции.fish`.

### Веб-интерфейс

Цвета терминала fish, строка приглашения, функции, переменные, история, привязки и сокращения могут быть настроены через интерактивный веб-интерфейс:

    fish_config

Он может не запуститься, если IPv6 отключен. Смотрите [1] и IPv6 (Русский)#Отключение IPv6.

### Завершение команд

fish может генерировать автодополнение из страниц руководства man. Оно сохраняется в `~/.config/fish/generated_completions/` и может быть сгенерировано командой:

    fish_update_completions

Вы также можете определить свои собственные правила автодополнения в `~/.config/fish/completions/`. Примеры можно посмотреть в `/usr/share/fish/completions/`.

Контекстно-зависимое автодополнение для команд, специфичных для Arch Linux, таких как pacman, pacman-key, makepkg, pbget, pacmatic, встроено в fish, поскольку политика разработки fish заключается в том, чтобы всё было включено в состав fish. Управление памятью достаточно умно, чтобы избежать любого негативного влияния на ресурсы.

## Советы и рекомендации

### Подстановка команд

В fish не реализована подстановка команд из истории в стиле Bash (наподобие `sudo !!`), и в fish faq разработчики рекомендуют использовать интерактивный интерфейс вставки команд истории: стрелка вверх (`Up`) вызывает поставляет прошлые строки из истории целиком, `Alt+Up` (или `Alt+.`) подставляет аргументы по отдельности, а `Alt+s` добавляет `sudo` в начало текущей строки.

Однако в fish wiki: описаны некоторые обходные пути: хотя они не обеспечивают полный аналог подстановки в стиле Bash, некоторые функции заменяют `!!` на предыдущую команду или `!$` на предыдущий последний аргумент.

### Отключение приветствия

По умолчанию fish печатает приветствие при запуске. Чтобы отключить его, выполните эту команду один раз:

    $ set -U fish_greeting

Это очищает универсальную переменную `fish_greeting`, которая является общей для всех экземпляров fish и сохраняется при перезапуске оболочки.

### Запуск fish через su

Если при выполнении su запускается с оболочкой Bash из-за того, что Bash является оболочкой по умолчанию целевого пользователя (root, если имя пользователя не указано), то можно создать функцию, которая всегда будет выполнять su с аргументом, запускающим оболочку fish вместо стандартной оболочки целевого пользователя:

    ~/.config/fish/functions/su.fish

    function su
       command su --shell=/usr/bin/fish $argv
    end

### Запуск X при входе

Добавьте следующее в конце файла `~/.config/fish/config.fish`.

    # Start X at login
    if status is-login
        if test -z "$DISPLAY" -a "$XDG_VTNR" = 1
            exec startx -- -keeptty
        end
    end

Если вы запускаете fish в интерактивном режиме, замените `status is-login` на `status is-interactive`.

### Отображение статуса git в приглашении

Если вы хотите, чтобы fish отображал статус branch и dirty, когда вы находитесь в каталоге git, можно создать такую функцию `fish_prompt`:

    ~/.config/fish/functions/fish_prompt.fish

    function fish_prompt
      set -l last_status $status

      if not set -q __fish_git_prompt_show_informative_status
        set -g __fish_git_prompt_show_informative_status 1
      end
      if not set -q __fish_git_prompt_color_branch
        set -g __fish_git_prompt_color_branch brmagenta
      end
      if not set -q __fish_git_prompt_showupstream
        set -g __fish_git_prompt_showupstream "informative"
      end
      if not set -q __fish_git_prompt_showdirtystate
        set -g __fish_git_prompt_showdirtystate "yes"
      end
      if not set -q __fish_git_prompt_color_stagedstate
        set -g __fish_git_prompt_color_stagedstate yellow
      end
      if not set -q __fish_git_prompt_color_invalidstate
        set -g __fish_git_prompt_color_invalidstate red
      end
      if not set -q __fish_git_prompt_color_cleanstate
        set -g __fish_git_prompt_color_cleanstate brgreen
      end

      printf '%s%s %s%s%s%s ' (set_color $fish_color_host) (prompt_hostname) (set_color $fish_color_cwd) (prompt_pwd) (set_color normal) (__fish_git_prompt)

      if not test $last_status -eq 0
        set_color $fish_color_error
      end
      echo -n '$ '
      set_color normal
    end

Однако теперь это устарело, смотрите fish-shell git. В качестве альтернативы, Informative Git Prompt теперь встроен в fish и при желании может быть активирован из fish_config.

### Изменение цвета имени хоста в приглашении при подключении через SSH

Для динамического изменения цвета имени хоста в приглашении при подключении по SSH добавьте следующие строки либо в функцию `fish_prompt`, либо в файл настроек fish, в данном примере используется красный цвет:

    ~/.config/fish/functions/fish_prompt.fish

    ...
    if set -q SSH_TTY
      set -g fish_color_host brred
    end
    ...

### Использование переменных ssh-agent

В fish выполнить команду `eval (ssh-agent)` не получится, так как в ней используется несовместимый способ установки переменных. Вместо этого можно использовать стиль csh с помощью опции `-c`:

    $ eval (ssh-agent -c)

### Хук "command not found"

В составе fish есть хук «command not found», который будет автоматически искать нераспознанную команду в пакетах подключенных репозиториев. Этот хук будет запущен с использованием pkgfile, или, если он не установлен, `pacman -F`.

Начиная с версии 3.2.2, «command not found» не будет использовать `pacman -F` по умолчанию из-за его плохой производительности.

Если задержка, которую вызывает такое поведение, нежелательна, этот хук можно отменить, переопределив `fish_command_not_found` так, чтобы он печатал только сообщение об ошибке:

    $ function fish_command_not_found
          __fish_default_command_not_found_handler $argv[1]
      end

Чтобы сделать это изменение постоянным, можно использовать встроенную функцию `funcsave`:

    $ funcsave fish_command_not_found

### Скрытие процесса из списка заданий

fish завершает все задания (jobs), переведённые в фоновый режим, когда fish завершает работу. Чтобы продолжить выполнение задания после завершения fish, сначала используйте `disown`. Например, следующая команда запускает `firefox` в фоновом режиме, а затем отсоединяет его от fish:

    $ firefox &
    $ disown

Таким образом firefox останется запущен после завершения работы fish. Смотрите disown(1) в оболочке fish для более подробной информации.

### Установка постоянного псевдонима

Чтобы быстро создать постоянный псевдоним, можно сделать так:

    $ alias lsl "ls -l"
    $ funcsave lsl

Начиная с версии 3.0, alias также поддерживает опцию `-s`/`--save`:

    $ alias -s lsl "ls -l"

Это создаст функцию:

    function lsl
        ls -l $argv
    end

и сохранит её. Чтобы увидеть все функции и/или отредактировать их, можно просто использовать `fish_config` и заглянуть на вкладку functions на странице настроек.

Более подробную информацию можно найти на официальном сайте: alias - create a function — fish-shell.

### Быстрая навигация по файловой системе с помощью zoxide

zoxide — умный аналог cd,, позволяющий перемещаться в любое место всего за несколько нажатий клавиш. Она запоминает ваши часто используемые каталоги и использует механизм подсчёта баллов, чтобы угадать, куда вы хотите перейти.

## Смотрите также

- https://fishshell.com/ - Домашняя страница
- https://fishshell.com/docs/current/ - Документация
- https://hyperpolyglot.org/unix-shells - Сравнение синтаксиса разных оболочек («shell rosetta»)
- https://github.com/fish-shell/fish-shell - репозиторий на GitHub

Category:

- Command-line shells (Русский)