Установка и настойка оболочки Fish на Ubuntu VPS

Linux и Unix-подобные операционные системы достаточно гибкие и имеют довольно много альтернатив практически для каждого компонента своей среды. Одним из компонентов, с которыми пользователи сервера взаимодействуют больше всего, является оболочка командной строки.

Большинство систем поставляется с оболочкой bash, но есть и другие варианты, которые можно использовать вместо нее. Возможно, вы слышали о популярной оболочке zsh.

Читайте также: Установка Z Shell (zsh) на облачный сервер

Еще одна альтернативная полнофункциональная оболочка – это fish; о ней и поговорим в этом руководстве. Оболочка fish — это современная производительная командная оболочка, которая может расширить возможности стандартной оболочки bash. В этом руководстве вы узнаете, как установить, настроить и использовать эту оболочку.

Примечание: Руководство было протестировано на экземпляре Ubuntu 12.04 VPS. Его можно использовать для справки или легко адаптировать к другому дистрибутиву.

Установка оболочки fish

Бинарный пакет fish можно найти в стандартном репозитории системы.

Его можно легко установить с помощью менеджера пакетов:

sudo apt-get update
sudo apt-get install fish

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

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

fish
demouser@host ~>

Командная строка изменится. Вместо $ будет символ >.

Базовые функции fish

Вы сразу же заметите некоторые преимущества этой оболочки.

Например, если вы запросите содержимое каталога, вы увидите, что все его файлы и подкаталоги автоматически заканчиваются символом, который указывает тип файла:

ls
bin/   etc/         lib/         media/  proc/  sbin/     sys/  var/
boot/  home/        lib64/       mnt/    root/  selinux/  tmp/  vmlinuz@
dev/   initrd.img@  lost+found/  opt/    run/   srv/      usr/

Это полностью совпадает с выводом команды ls –F, которая классифицирует контент по типу.

Если вы введете путь к файлу (относительный или абсолютный), вы увидите, что оболочка подчеркивает пути к каталогам, чтобы было удобнее:

cd /home/demo

Если ваш терминал имеет возможность отображать цветной вывод, вы заметите, что командная строка также будет автоматически отмечена цветами. Кроме того, это делается динамически. Если вы допустите ошибку, она будет выделена красным.

Автозаполнение

Отдельное внимание стоит обратить на продвинутое автозаполнение, которое обеспечивает клавиша TAB:

cd /    ## Hit the TAB key at this point
/bin/    (Directory)  /media/    (Directory)  /srv/  (Directory)
/boot/   (Directory)  /mnt/      (Directory)  /sys/  (Directory)
/dev/    (Directory)  /opt/      (Directory)  /tmp/  (Directory)
/etc/    (Directory)  /proc/     (Directory)  /usr/  (Directory)
/home/   (Directory)  /run/      (Directory)  /var/  (Directory)
/lib/    (Directory)  /sbin/     (Directory)
/lib64/  (Directory)  /selinux/  (Directory)

Как вы можете видеть, в данном случае оболочка fish перечисляет только каталоги для команды cd.

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

touch /     ## Hit the TAB key at this point
/bin/                  (Directory)  /proc/               (Directory)
/boot/                 (Directory)  /root/               (Directory)
/dev/                  (Directory)  /run/                (Directory)
/etc/                  (Directory)  /sbin/               (Directory)
/home/                 (Directory)  /selinux/            (Directory)
/initrd.img  (Symbolic link, 15MB)  /srv/                (Directory)
/lib/                  (Directory)  /sys/                (Directory)
/lib64/                (Directory)  /tmp/                (Directory)
/lost+found/           (Directory)  /usr/                (Directory)
/media/                (Directory)  /var/                (Directory)
/mnt/                  (Directory)  /vmlinuz  (Symbolic link, 5.2MB)
/opt/                  (Directory)

Аналогичная полезная функция – это форматирование команды man. Чтобы запросить все страницы man, можно использовать табуляцию:

man fish    ## Hit the TAB key at this point
fish       (1: the friendly interactive shell)
fish_indent       (1: indenter and prettifier)
fish_pager  (1: internal command used by fish)
fishd           (1: universal variable daemon)

Подобную справку можно получить с помощью любого терминального браузера, используя встроенную справочную систему:

help
fish home | Main documentation page | Design document | Commands | FAQ |
License
Fish user documentation
1
Table of contents
Fish user documentation
□ Table of contents
□ Introduction
□ Syntax overview
□ Help
□ Tab completion

Вы можете переходить по ссылкам, как в обычном браузере. Чтобы выйти, нужно нажать «q». Если вы хотите получить справку для определенной команды, о которой знает fish, просто используйте ее в качестве аргумента:

help cd
cd - change directory
Synopsis
cd [DIRECTORY]
Description Changes the current
directory. If DIRECTORY is supplied it will become the new directory. If
DIRECTORY is a relative path, the paths found in the CDPATH environment
variable array will be tried as prefixes for the specified path. If
CDPATH is not set, it is assumed to be '.'. If DIRECTORY is not
specified, $HOME will be the new directory.
Back to index.

Чтобы просмотреть доступные команды справки help, используйте автозаполнение с помощью TAB.

help    ## Type a space to let fish know you are finished with the command, and then hit the TAB key at this point
alias                                   (Help for the specified command)
and                                     (Help for the specified command)
begin                                   (Help for the specified command)
bg                                      (Help for the specified command)
bind                                    (Help for the specified command)
block                                   (Help for the specified command)
break                                   (Help for the specified command)
breakpoint                              (Help for the specified command)
. . .

Общие задачи

Многие люди, которые в течение многих лет использовали bash или даже sh, привыкли к тому, как работают эти оболочки. Оболочка fish действительно во многом наследует bash и sh, но она предлагает много улучшений.

Перенаправление, конвейеры и специальные символы

Начнем с перенаправления. Обычно перенаправление и конвейеры работают так же, как в bash:

  • |: передает вывод команды слева как ввод для команды справа.
  • <: извлекает стандартный ввод из файла справа вместо клавиатуры.
  • >:записывает стандартный вывод в файл справа.

Однако одно отличие заключается в том, что вы можете перенаправить стандартную ошибку. Для этого используется символ ^ — он перенаправит стандартную ошибку в местоположение справа.

Это обеспечивает простой способ перенаправления дескрипторов файлов. Напомним, что каждый дескриптор файла обычно ассоциируется с числом:

  • 0: стандартный ввод. По умолчанию входные данные поступают с клавиатуры.
  • 1: стандартный вывод. По умолчанию это экран.
  • 2: стандартная ошибка. Ошибки команды по умолчанию выводятся на экран.

Вы можете перенаправить один файловый дескриптор на другой, используя символ «&», за которым должен следовать номер дескриптора.

Например, вы можете перенаправить стандартный вывод команды в файл, а затем направить стандартную ошибку в стандартный выходной файл:

ls /etc >ls_results.txt ^&1

Весь стандартный вывод помещается в файл ls_results.txt, а затем стандартная ошибка направляется в точку стандартного вывода (это файл выше).

Что касается специальных символов, fish снова использует большинство значений по умолчанию из bash:

  • *: отвечает любой строке символов, которая не включает «/».
  • ?:  отвечает любому одиночному символу, не включая «/».

Дополнительным символом является рекурсивный подстановочный знак **. Он отвечает любой строке, включая «/».

Это позволяет легко добавить рекурсивную функциональность в команды. У ls есть рекурсивный вариант, но вы можете проверить эту функцию на ней. Попробуйте найти все файлы, которые заканчиваются на .conf в каталоге /etc:

ls /etc/**.conf
/etc/adduser.conf
/etc/apparmor/subdomain.conf
. . .

Функции и псевдонимы

Вы можете создавать функции и псевдонимы в fish с помощью простого синтаксиса.

Базовый формат выглядит так:

function function_name
function_content
end

Если вы хотите проанализировать аргументы функции, обратитесь к переменной $argv, где они хранятся в виде массива.

Например, можно сделать такую функцию, которая будет выводить все аргументы:

function say_hello
echo hello $argv
end

Ее можно вызвать с одним или несколькими аргументами, и все они будут переданы команде echo:

say_hello John Doe
hello John Doe

Если вы хотите получить доступ к определенной переменной, извлеките ее из массива аргументов по номеру (в fish массивы индексируются с 1, а не 0). Попробуйте изменить предыдущий скрипт, чтобы использовать только второй аргумент:

function hello_sir
echo hello Mr. $argv[2]
end

Вызовите функцию, и вы получите другой результат:

hello_sir John Doe
hello Mr. Doe

Все функции можно просмотреть с помощью команды:

functions -a

Удалить функцию может эта команда:

functions -e function_name

Для псевдонимов оболочка bash предлагает определенную команду. А fish использует тот же синтаксис функции.

Единственное, что нужно знать – если команда смещает или заменяет команду, на которую ссылается, вы должны добавить команду command, чтобы сообщить оболочке, что нужно не рекурсивно вызывать функцию, а использовать внешнюю команду.

Например, если вы хотите, чтобы команда cat включала нумерацию по умолчанию, вы могли бы переопределить команду и добавить в нее этот флаг. Не забудьте передать переменную аргумента, чтобы она могла правильно анализировать имена файлов:

function cat
command cat -n $argv
end

Теперь вызовите команду cat:

cat /etc/hosts
1  127.0.0.1   localhost fish fish
2
3  # The following lines are desirable for IPv6 capable hosts
4  ::1     ip6-localhost ip6-loopback
5  fe00::0 ip6-localnet
6  ff00::0 ip6-mcastprefix
7  ff02::1 ip6-allnodes
8  ff02::2 ip6-allrouters

Если вы используете функцию для переопределения стандартного поведения команды, вы также можете использовать command, чтобы обойти все изменения, которые вы сделали ранее, и получить оригинальную команду.

command cat /etc/hosts
127.0.0.1   localhost fish fish
# The following lines are desirable for IPv6 capable hosts
::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters

Упрощенная история

Оболочка bash предоставляет очень сложный, но полезный набор функций истории. fish сокращает и старается улучшить и упростить его.

Вы можете хронологически перемещаться по истории с помощью клавиши UP. Перемещаться в обратном направлении можно с помощью клавиши DOWN. Это довольно стандартно.

Если вы хотите вернуться к командной строке, просто нажмите Escape.

Также можно ввести часть предыдущей команды, а затем нажать клавишу UP и найти последние экземпляры этой конкретной команды.

Кроме того, вы можете использовать команды ALT-UP и ALT-DOWN для вызова аргументов командной строки.

Предположим, вы хотите просмотреть содержимое каталога:

ls /etc
acpi/                   groff/               ltrace.conf              rmt*
adduser.conf            group                magic                    rpc
alternatives/           group-               magic.mime               rsyslog.conf
apm/                    grub.d/              mailcap                  rsyslog.d/
apparmor/               gshadow              mailcap.order            screenrc
. . .

Вы понимаете, что это нужный каталог, и хотите перейти в него. Введите новую команду:

cd

Теперь можно вставить аргументы из последней команды, нажав клавиши ALT-UP:

cd      # Нажмите Alt-UP и вы получите…
cd /etc

Это очень простой пример, но сама функция невероятно полезна, тем более, что вы можете просмотреть все предыдущие аргументы команды.

Другой вид истории, которую предоставляет fish, — история каталогов. Это отличная функция, которая позволяет вам пользоваться историей команды cd, чтобы перейти к предыдущим каталогам.

Для этого введите:

dirh

Вы можете перемещаться вниз и вверх по истории каталогов, нажимая ALT-LEFT и ALT-RIGHT в пустой командной строке. Это позволяет вам легко переключаться между каталогами.

Создание конфигурационных файлов и изменение оболочки по умолчанию

Если вам нравится работать в оболочке fish , вы, вероятно, захотите включить некоторые настройки для формирования вашей среды.

Возможно, вы привыкли вносить поправки в файлы ~/.bashrc или ~/.bash_profile, но таких файлов в этой оболочке нет.

Чтобы настроить свои предпочтения, вы должны создать файл ~/.config/fish/config.fish. Все конфигурационные файлы fish должны заканчиваться расширением .fish. Обычно путь ~/.config/fish/ создается тогда, когда вы используете оболочку впервые.

Если вы хотите создать файл на основе образца, вы можете скопировать его из каталога fish:

cp /usr/share/fish/config.fish ~/.config/fish

Затем отредактируйте его:

nano ~/.config/fish/config.fish

Ознакомившись с файлом, вы можете удалить все параметры, которые вам не понадобятся.

Лучше не добавлять функции непосредственно в этот файл конфигурации. Вместо этого вы должны создать каталог functions в каталоге конфигураций fish:

mkdir ~/.config/fish/functions

Внутри этого каталога создайте файлы для каждой из функций. Каждый файл, который заканчивается на .fish, оболочка найдет и включит в свою среду. Каждая функция должна быть в собственном файле.

Например, можно создать файл, чтобы сделать функцию hello_sir доступной в каждой сессии.

Примечание: Прежде чем продолжить, не забудьте отключить псевдоним cat, который сделали ранее, с помощью set -e cat, если вы этого еще не сделали уже.

cat > ~/.config/fish/functions/hello_sir.fish
function hello_sir
echo hello Mr. $argv[2]
end

Введя end, нажмите CTRL-D, чтобы завершить ввод. Теперь функция будет доступна при каждой загрузке оболочки. Если вы хотите также добавить функцию say_hello, вам нужен отдельный файл.

Для вдохновения можно просмотреть функции по умолчанию:

cd /usr/share/fish/functions

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

Во-первых, вам нужно знать путь к оболочке fish:

which fish
/usr/bin/fish

Затем можно изменить оболочку, набрав:

chsh -s /usr/bin/fish

Вам будет предложено подтвердить пароль. После этого при каждой загрузке системы вы будете получать доступ к командной строке fish.

Если вы хотите вернуться к другой оболочке, вы можете указать ее путь таким же образом:

chsh -s /bin/bash

Заключение

Теперь вы знакомы с основами использования оболочки fish. Это хорошая альтернатива для многих пользователей, потому что она во многом придерживается конвенции, но по возможности добавляет или улучшает функциональность.

Tags: , ,