Spec-Zone.ru › Fish 2.3

Документация

Введение

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

Обзор синтаксиса

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

Команда выполняется путем написания имени команды, за которым следуют любые аргументы.

Пример:

echo hello world

Это вызывает команду echo. echo — это команда, которая выведет свои аргументы на экран. В примере выше, результатом будет «hello world». Всё в fish выполняется с помощью команд. Есть команды для выполнения набора команд несколько раз, команды для присваивания переменных, команды для обработки группы команд как единой команды и т. д. При этом каждая команда использует тот же простой синтаксис.

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

man — это команда для отображения страницы руководства по заданной теме. Команда man принимает имя страницы руководства для отображения в качестве аргумента. На большинстве компьютеров есть страницы руководства почти для каждой команды. Также есть страницы руководств для многих других вещей, таких как системные библиотеки и важные файлы.

Любая программа на вашем компьютере может использоваться как команда в fish. Если файл программы находится в одном из каталогов в PATH, достаточно ввести имя программы для её использования. В противном случае необходимо использовать полное имя файла, включая каталог (например, /home/me/code/checkers/checkers или ../checkers).

Вот список некоторых полезных команд:

  • cd, изменить текущий каталог
  • ls, список файлов и каталогов
  • man, отобразить страницу руководства на экране
  • mv, переместить (переименовать) файлы
  • cp, копировать файлы
  • open, открыть файлы с помощью приложения по умолчанию, связанного с каждым типом файла
  • less, отобразить содержимое файлов

Команды и параметры разделяются символом пробела ' '. Каждая команда завершается либо новой строкой (т.е. нажатием клавиши возврата) или точкой с запятой ';'. Несколько команд могут быть записаны в одной строке, разделяя их точками с запятой.

Переключатель — это очень распространённый специальный тип аргумента. Переключатели почти всегда начинаются с одного или нескольких тире '-' и изменяют способ работы команды. Например, команда 'ls' обычно выводит список всех файлов и каталогов в текущем рабочем каталоге, но с помощью переключателя '-l' поведение 'ls' изменяется, чтобы отображать не только имя файла, но также размер, разрешения, владельца и время изменения каждого файла.

Переключатели различаются между командами и документируются в справочной странице для каждой команды. Однако некоторые переключатели распространены для большинства команд, например, '--help' обычно отобразит текст справки, '-i' часто включит интерактивное приглашение перед выполнением действия, а '-f' — отключит его.

Кавычки

Иногда такие функции, как расширение параметров и экранирование символов, мешают. В таких случаях пользователь может заключить параметр в кавычки, используя либо ' (одинарные кавычки), либо " (двойные кавычки). Существует одно важное различие между строками в одинарных и двойных кавычках: при использовании строк в двойных кавычках всё ещё происходит расширение переменных. Кроме этого, никакое другое расширение (включая расширение фигурных скобок и расширение параметров) не произойдёт, параметр может содержать пробелы, а последовательности экранирования игнорируются. Единственные экранированные последовательности обратного слэша, разрешенные в одинарных кавычках, это \', экранирующий одинарную кавычку, и \\, экранирующий символ обратного слэша. Единственные экранированные последовательности обратного слэша, разрешенные в двойных кавычках, это \", экранирующий двойную кавычку, \$, экранирующий символ доллара, \ и символ новой строки, удаляющий обратный слэш и новую строку, и, наконец, \\, экранирующий символ обратного слэша. Одинарные кавычки не имеют специального значения внутри двойных кавычек, и наоборот.

Пример:

rm "cumbersome filename.txt"

Удалит файл «cumbersome filename.txt», в то время как

rm cumbersome filename.txt

удалило бы два файла «cumbersome» и «filename.txt».

Экранирование символов

Некоторые символы не могут быть введены напрямую в командной строке. Для этих символов предоставляются так называемые последовательности экранирования. Это:

  • '\a' представляет собой символ оповещения
  • '\b' представляет собой символ удаления
  • '\e' представляет собой символ экранирования
  • '\f' представляет собой символ перевода страницы
  • '\n' представляет собой символ новой строки
  • '\r' представляет собой символ возврата каретки
  • '\t' представляет собой символ табуляции
  • '\v' представляет собой символ вертикальной табуляции
  • '\ ' экранирует символ пробела
  • '\$' экранирует символ доллара
  • '\\' экранирует символ обратного слэша
  • '\*' экранирует символ звёздочки
  • '\?' экранирует символ вопроса
  • '\~' экранирует символ тильды
  • '\%' экранирует символ процента
  • '\#' экранирует символ решётки
  • '\(' экранирует символ левой круглой скобки
  • '\)' экранирует символ правой круглой скобки
  • '\{' экранирует символ левой фигурной скобки
  • '\}' экранирует символ правой фигурной скобки
  • '\[' экранирует символ левой квадратной скобки
  • '\]' экранирует символ правой квадратной скобки
  • '\<' экранирует символ меньше
  • '\>' экранирует символ больше
  • '\^' экранирует символ крышечки
  • '\&' экранирует символ амперсанда
  • '\;' экранирует символ точки с запятой
  • '\"' экранирует символ кавычки
  • '\'' экранирует символ апострофа
  • '\xxx', где xx — шестнадцатеричное число, представляет собой символ ASCII с указанным значением. Например, \x9 — это символ табуляции.
  • '\Xxx', где xx — шестнадцатеричное число, представляет байт данных с указанным значением. Если вы используете многобайтовую кодировку, это может быть использовано для ввода недопустимых строк. Используйте это только в том случае, если вы знаете, что делаете.
  • '\ooo', где ooo — восьмеричное число, представляет собой символ ASCII с указанным значением. Например, \011 — это символ табуляции.
  • '\uxxxx', где xxxx — шестнадцатеричное число, представляет собой 16-битный символ Unicode с указанным значением. Например, \u9 — это символ табуляции.
  • '\Uxxxxxxxx', где xxxxxxxx — шестнадцатеричное число, представляет собой 32-битный символ Unicode с указанным значением. Например, \U9 — это символ табуляции.
  • '\cx', где x — буква алфавита, представляет управляющую последовательность, созданную при нажатии клавиши управления и указанной буквы. Например, \ci — это символ табуляции

Перенаправление ввода/вывода (IO)

Большинство программ используют три потока ввода/вывода (IO), каждый из которых представлен числом, называемым дескриптором файла (FD). Это:

  • Стандартный ввод, FD 0, для чтения, по умолчанию считывает данные с клавиатуры.
  • Стандартный вывод, FD 1, для записи, по умолчанию записывает данные на экран.
  • Стандартная ошибка, FD 2, для записи ошибок и предупреждений, по умолчанию записывает данные на экран.

Причина предоставления двух дескрипторов вывода заключается в возможности отделения ошибок и предупреждений от обычного вывода программы.

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

Пример перенаправления файла — echo hello > output.txt, который перенаправляет вывод команды echo в файл output.txt.

  • Для чтения стандартного ввода из файла напишите <SOURCE_FILE
  • Для записи стандартного вывода в файл напишите >DESTINATION
  • Для записи стандартной ошибки в файл напишите ^DESTINATION
  • Для добавления стандартного вывода в файл напишите >>DESTINATION_FILE
  • Для добавления стандартной ошибки в файл напишите ^^DESTINATION_FILE

DESTINATION может быть одним из следующих:

  • Имя файла. Вывод будет записан в указанный файл.
  • Амперсанд (&) и номер другого дескриптора файла. Вывод будет записан в этот дескриптор файла вместо этого.
  • Амперсанд, за которым следует знак минус (&-). Дескриптор файла будет закрыт.

Пример:

Для перенаправления как стандартного вывода, так и стандартной ошибки в файл «all_output.txt» вы можете написать echo Hello > all_output.txt ^&1.

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

  • Для перенаправления ввода FD N, напишите N<DESTINATION
  • Для перенаправления вывода FD N, напишите N>DESTINATION
  • Для добавления вывода FD N в файл, напишите N>>DESTINATION_FILE

Пример: echo Hello 2>output.stderr и echo Hello ^output.stderr эквивалентны и записывают стандартную ошибку (дескриптор файла 2) целевой программы в output.stderr.

Каналы

Пользователь может объединить несколько команд в так называемую цепочку команд. Это означает, что стандартный вывод одной команды будет считан как стандартный ввод следующей команды. Это делается путём разделения команд символом канала '|'. Например

cat foo.txt | head

вызовет программу cat с параметром 'foo.txt', которая выведет содержимое файла 'foo.txt'. Затем содержимое foo.txt будет отфильтровано программой 'head', которая передаст на экран первые десять строк файла. Для получения дополнительной информации о том, как объединять команды через конвейеры, прочитайте страницы руководства по командам, которые вы хотите использовать, с помощью команды man. Если вы хотите узнать больше о программе cat, введите man cat.

Конвейеры обычно соединяют дескриптор файла 1 (стандартный вывод) первого процесса с дескриптором файла 0 (стандартный ввод) второго процесса. Можно использовать другой дескриптор вывода, добавив желаемый номер FD и затем символ перенаправления вывода в конвейер. Например:

make fish 2>| less

попытается собрать программу fish, а любые ошибки будут показаны с помощью страницы отображения less.

Задачи в фоновом режиме

Когда вы запускаете задачу в fish, сама fish приостановится и передаст управление терминалом только что запущенной программе. Иногда вы хотите продолжить использование командной строки и запустить задачу в фоновом режиме. Для создания задачи в фоновом режиме добавьте & (амперсанд) к вашей команде. Это сообщит fish о запуске задачи в фоновом режиме. Задачи в фоновом режиме очень полезны при запуске программ с графическим интерфейсом пользователя.

Пример:

emacs &

запустит текстовый редактор emacs в фоновом режиме.

Управление задачами

Большинство программ позволяют приостановить выполнение программы и вернуть управление fish, нажав Control-Z (также обозначается как ^Z). Вернувшись в командную строку fish, вы можете запустить другие программы и сделать всё, что вам нужно. Затем, если вы захотите, вы сможете вернуться к приостановленной команде, используя команду fg (фоновый режим).

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

Чтобы получить список всех запущенных задач, используйте команду jobs.

Функции

Функции — это программы, написанные на языке синтаксиса fish. Они группируют одну или несколько команд и их аргументы под одним именем. Также их можно использовать для запуска определённой команды с дополнительными аргументами.

Например, следующее определение функции вызывает команду ls с аргументом '-l', чтобы вывести подробный список содержимого текущей директории:

function ll
    ls -l $argv
end

Первая строка сообщает fish о том, что должна быть определена функция с именем ll. Чтобы использовать её, просто напишите ll в командной строке. Вторая строка сообщает fish, что команда ls -l $argv должна быть вызвана при вызове ll. '$argv' — это массивная переменная, которая всегда содержит все аргументы, отправленные в функцию. В приведённом примере они просто передаются команде ls. Для получения дополнительной информации о функциях, см. документацию по встроенной команде function.

Определение псевдонимов

Одно из наиболее распространённых применений функций — незначительное изменение поведения уже существующей команды. Например, можно переопределить команду ls для отображения цветов. Переключатель для включения цвета в системах GNU — '--color=auto'. Псевдоним, или оболочка, вокруг ls может выглядеть следующим образом:

function ls
    command ls --color=auto $argv
end

Следует отметить несколько важных моментов относительно псевдонимов:

  • Всегда следите за тем, чтобы добавить переменную $argv в список параметров для обернутой команды. Это гарантирует, что, если пользователь указывает дополнительные параметры функции, они передаются в основную команду.
  • Если псевдоним имеет то же имя, что и алиасируемая команда, необходимо префиксровать вызов программы с command для того, чтобы сообщить fish, что функция не должна вызывать себя, а должна вызывать команду с тем же именем. Отсутствие этого приведёт к ошибкам бесконечной рекурсии.

Для лёгкого создания функции этого типа можно использовать команду alias.

Автозагрузка функций

Функции могут быть определены в командной строке или в файле конфигурации, но они также могут быть загружены автоматически. Этот метод определения функций имеет несколько преимуществ. Автоматически загруженная функция становится доступной для всех работающих оболочек. Если определение функции изменено, все работающие оболочки автоматически перезагрузят изменённую версию. Время запуска и использование памяти улучшаются и т. д.

Fish автоматически ищет все каталоги в массиве переменных $fish_function_path, а любые определённые в них функции загружаются автоматически по мере необходимости. Файл определения функции должен иметь имя файла, состоящее из имени функции и суффикса '.fish'.

По умолчанию Fish ищет функции в следующих каталогах, используя первый доступный найденный файл:

  • Директория для конечных пользователей для хранения собственных функций, обычно ~/.config/fish/functions (управляемая переменной среды XDG_CONFIG_HOME).
  • Директория для системных администраторов для установки функций для всех пользователей системы, обычно /etc/fish/functions.
  • Директория для поставщиков стороннего программного обеспечения для поставки собственных функций для их программного обеспечения, обычно /usr/share/fish/vendor_functions.d.
  • Функции, поставляемые с fish, обычно установлены в /usr/share/fish/functions.

Эти пути контролируются параметрами, установленные во время сборки, установки или выполнения, и могут отличаться от указанных значений по умолчанию.

Этот широкий поиск может быть запутанным. Если вы не уверены, ваши функции, вероятно, должны находиться в ~/.config/fish/functions.

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

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

Если вы разрабатываете другую программу, вы можете установить функции, которые доступны всем пользователям оболочки fish в системе. Они могут быть установлены в директорию функций «vendor». Поскольку этот путь может отличаться в зависимости от системы, для поиска этого пути следует использовать фреймворк pkgconfig с выводом pkg-config --variable functionsdir fish.

Условное выполнение кода и управление потоком

Существует четыре встроенные команды fish, которые позволяют выполнять команды только при соблюдении определённых критериев. Эти встроенные команды: if, switch, and и or.

Команда switch используется для выполнения одного из нескольких блоков команд в зависимости от значения строки. Для получения дополнительной информации см. документацию по команде switch.

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

Некоторые общие слова

Это краткое объяснение некоторых часто используемых слов в fish.

  • аргумент параметр, предоставленный команде
  • встроенная команда команда, реализованная в оболочке. Встроенные команды — это команды, которые так тесно связаны с оболочкой, что их невозможно реализовать как внешние команды.
  • команда программа, которую может запустить оболочка.
  • функция блок команд, который можно вызывать так, как если бы это была одна команда. Используя функции, можно объединить несколько меньших команд в одну более сложную команду.
  • задача работающая цепочка команд или команда
  • цепочка команд набор команд, соединённых так, что вывод одной команды является вводом следующей команды
  • перенаправление операция, изменяющая один из потоков ввода/вывода, связанных с задачей
  • переключатель специальный флаг, отправленный в качестве аргумента команде, который изменит поведение команды. Переключатель почти всегда начинается с одного или двух тире.

Помощь

fish имеет расширенную систему помощи. Используйте команду help для получения помощи по определённой теме или команде. Например, написание help syntax отображает раздел синтаксиса этого документа.

fish также имеет страницы руководства для своих команд. Например, man set отобразит документацию по set как страницу руководства.

Помощь по определённой встроенной команде также может быть получена с параметром -h . Например, чтобы получить помощь по встроенной команде fg, введите fg -h или help fg.

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

fish предлагает команды по мере ввода, основываясь на истории команд, завершениях и допустимых путях к файлам. По мере ввода команд вы увидите предложенное дополнение после курсора, серым цветом (который можно изменить с помощью переменной fish_color_autosuggestion).

Чтобы принять автозаполнение (заменив содержимое командной строки), нажмите правую стрелку или Control-F. Чтобы принять первое предложенное слово, нажмите Alt-→ или Alt-F. Если автозаполнение не то, что вы хотите, просто проигнорируйте его: оно не выполнится, пока вы его не примете.

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

Заполнение клавишей Tab

Автодополнение — одна из наиболее экономичных функций любой современной оболочки. Нажав клавишу Tab, пользователь просит fish угадать оставшуюся часть команды или параметра, который пользователь вводит в данный момент. Если fish может найти только одно возможное завершение, fish выведет его. Если существует более одного завершения, fish выведет самый длинный общий префикс всех завершений. Если завершения отличаются первым символом, выводится список всех возможных завершений. Список содержит описания завершений, и если список не помещается на экране, его можно прокручивать с помощью клавиш со стрелками, клавиш Page Up/Page Down, клавиши Tab или клавиши пробела. После того, как список введён, нажатие любой другой клавиши начнёт поиск. Если список не введён, нажатие любой другой клавиши выведет список и вставит набранный символ в командную строку.

Вот общие автозавершения, которые fish предоставляет:

  • Автозавершение команд (встроенных, функций и обычных программ).
  • Автозавершение имён переменных оболочки.
  • Автозавершение имён пользователей для расширения тильды.
  • Автозавершение имён файлов, даже в строках с подстановкой, таких как '*', '**' и '?'.
  • Автозавершение ID задания, имени задания и имён процессов для расширения процессов.

fish предоставляет большое количество специфичных для программы автозавершений. Большинство из этих завершений — простые параметры, такие как параметр -l для ls, но некоторые более сложные. Последние включают:

  • Программы man и whatis показывают все установленные страницы справки в качестве завершений.
  • Программа make использует все цели в файле Makefile в текущем каталоге как завершения.
  • Команда mount использует все точки монтирования, указанные в fstab, в качестве завершений.
  • Команда ssh использует все хосты, которые хранятся в файле known_hosts, в качестве завершений. (См. документацию по ssh для получения дополнительной информации)
  • Команда su использует всех пользователей в системе в качестве завершений.
  • Команды apt-get, rpm и yum используют все установленные пакеты в качестве завершений.

Написание собственных завершений

Указание собственных завершений несложно. Для указания завершения используйте команду complete. complete принимает в качестве параметра имя команды, для которой нужно указать завершение. Например, чтобы добавить завершение для программы myprog, нужно начать команду завершения с complete -c myprog ...

Для предоставления списка возможных завершений для myprog используйте переключатель -a. Если myprog принимает аргументы start и stop, это можно указать как complete -c myprog -a 'start stop'. Аргумент переключателя -a всегда является строкой. Во время завершения он будет токенизирован по пробелам и табуляциям, и будут выполнены расширение переменных, подстановка команд и другие формы расширения параметров.

fish имеет специальный синтаксис для поддержки указания переключателей, принимаемых командой. Переключатели -s, -l и -o используются для указания короткого переключателя (символ, такого как -l), переключателя в стиле GNU (такого как '--color') и переключателя старого стиля (например, '-shuffle'), соответственно. Если команда 'myprog' имеет опцию '-o', которую также можно записать как '--output', и которая может принимать дополнительное значение 'yes' или 'no', это можно указать, написав:

complete -c myprog -s o -l output -a "yes no"

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

Примеры написания собственных сложных завершений можно найти в /usr/share/fish/completions. (Точный путь зависит от выбранного префикса установки и может незначительно отличаться).

Полезные функции для написания завершений

fish поставляется с несколькими функциями, которые очень полезны при написании завершений, специфичных для команд. Большинство из этих функций начинаются со строки '__fish_'. Такие функции являются внутренними для fish и их имя и интерфейс могут измениться в будущих версиях fish. Тем не менее, некоторые из них могут быть очень полезны при написании завершений. Некоторые из этих функций описаны здесь. Имейте в виду, что они могут быть удалены или изменены в будущих версиях.

Функции, начинающиеся со строки __fish_print_ выводят список строк, разделённых новой строкой. Например, __fish_print_filesystems выводит список всех известных файловых систем. Функции, начинающиеся со строки __fish_complete_ выводят список завершений с описаниями, разделёнными символом табуляции.

  • __fish_complete_directories STRING DESCRIPTION выполняет автозавершение путей для STRING, разрешая только каталоги и предоставляя им описание DESCRIPTION.
  • __fish_complete_path STRING DESCRIPTION выполняет автозавершение путей для STRING, предоставляя им описание DESCRIPTION.
  • __fish_complete_groups выводит список всех групп пользователей с членами групп в качестве описания.
  • __fish_complete_pids выводит список всех идентификаторов процессов с именем команды в качестве описания.
  • __fish_complete_suffix SUFFIX выполняет автозавершение файлов, разрешая только файлы, оканчивающиеся на SUFFIX, с необязательным описанием.
  • __fish_complete_users выводит список всех пользователей с их полным именем в качестве описания.
  • __fish_print_filesystems выводит список всех известных файловых систем. В настоящее время это статический список, не зависящий от того, какие файловые системы фактически поддерживает хост-операционная система.
  • __fish_print_hostnames выводит список всех известных имён хостов. Эта функция ищет nfs-серверы в fstab, хосты в known_hosts и проверяет файл /etc/hosts.
  • __fish_print_interfaces выводит список всех известных сетевых интерфейсов.
  • __fish_print_packages выводит список всех установленных пакетов. В настоящее время эта функция обрабатывает пакеты Debian, rpm и Gentoo.

Где хранить завершения

Завершения могут быть определены в командной строке или в файле конфигурации, но также могут быть загружены автоматически. Fish автоматически ищет все каталоги в массиве переменных $fish_complete_path, и все определенные в них завершения автоматически загружаются при необходимости. Файл завершений должен иметь имя, состоящее из имени команды, для которой требуется завершение, и суффикса '.fish'.

По умолчанию Fish ищет завершения в следующих местах, используя первый найденный файл:

  • Каталог для пользователей, чтобы хранить свои собственные завершения, обычно ~/.config/fish/completions (управляется переменной окружения XDG_CONFIG_HOME);
  • Каталог для системных администраторов, чтобы устанавливать завершения для всех пользователей в системе, обычно /etc/fish/completions;
  • Каталог для поставщиков программного обеспечения третьих сторон, чтобы предоставлять свои собственные завершения для своих программ, обычно /usr/share/fish/vendor_completions.d;
  • Завершения, поставляемые с fish, обычно установленные в /usr/share/fish/completions; и
  • Завершения, автоматически сгенерированные из справочной информации операционной системы, обычно хранящиеся в ~/.local/share/fish/generated_completions.

Эти пути управляются параметрами, установленными при построении, установке или запуске, и могут отличаться от указанных выше значений по умолчанию.

Этот обширный поиск может быть запутанным. Если вы не уверены, ваши завершения, вероятно, должны находиться в ~/.config/fish/completions.

Если вы написали новые завершения для распространённой команды Unix, пожалуйста, рассмотрите возможность поделиться своей работой, отправив её по инструкциям в Дополнительная помощь и разработка.

Если вы разрабатываете другую программу и хотите предоставить завершения со своей программой, установите их в каталог завершений "vendor". Поскольку этот путь может отличаться в системах, для определения этого пути с помощью результата pkg-config --variable completionsdir fish следует использовать фреймворк pkgconfig.

Расширение параметров (Подстановка)

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

Шаблоны

Если в параметре присутствует звёздочка (*) или знак вопроса (?), fish пытается сопоставить данный параметр с любыми файлами таким образом, что:

  • ? может сопоставляться с любым одиночным символом, кроме '/'.
  • * может сопоставляться с любой строкой символов, не содержащей '/'. Включает сопоставление пустой строки.
  • ** сопоставляется с любой строкой символов. Включает сопоставление пустой строки. Сопоставленная строка может включать символ /; то есть, выполняется рекурсия в подкаталоги. Обратите внимание, что добавление этой подстановки к другим строкам не будет сопоставлять файлы в текущем рабочем каталоге ($PWD) если вы разделяете строки слэшем ("/"). Это отличается от других оболочек, таких как zsh. Например, **\/*.fish в zsh будет сопоставлять файлы .fish в PWD, но в fish будет сопоставлять такие файлы только в подкаталоге. В fish нужно набрать ***.fish для сопоставления файлов в PWD и в подкаталогах.

Другие оболочки, такие как zsh, предоставляют богатый синтаксис подстановки для ограничения файлов, сопоставленных с подстановкой. Например, **(.), чтобы сопоставлять только обычные файлы. Fish предпочитает делегировать такие функции программам, таким как find, а не изобретать велосипед. Таким образом, если вы хотите ограничить расширение подстановок только обычными файлами, подход fish — определить и использовать функцию. Например,

function ff --description 'Like ** but only returns plain files.'
    # This also ignores .git directories.
    find . \( -name .git -type d -prune \) -o -type f | \ 
        sed -n -e '/^\.\/\.git$/n' -e 's/^\.\///p'
end

Тогда вы можете использовать её вместо ** следующим образом my_prog (ff), чтобы передать только обычные файлы в или под $PWD в my_prog.

Сопоставления шаблонов сортируются без учёта регистра. При сортировке сопоставлений, содержащих числа, последовательные цифры рассматриваются как один элемент, так что строки '1', '5' и '12' будут отсортированы в указанном порядке.

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

Примеры:

  • a* соответствует всем файлам, начинающимся с буквы 'a' в текущем каталоге.
  • ??? соответствует любому файлу в текущем каталоге, имя которого состоит ровно из трёх символов.
  • ** соответствует всем файлам и каталогам в текущем каталоге и всех его подкаталогах.

Обратите внимание, что для большинства команд, если какой-либо шаблон не расширяется, команда не выполняется, $status устанавливается в ненулевое значение, и выводится предупреждение. Это поведение соответствует установке shopt -s failglob в bash. Есть ровно 3 исключения, а именно set, count и for. Их шаблоны разрешено расширять до нулевого количества аргументов, как и в случае с shopt -s nullglob в bash.

Примеры:

ls *.foo
# Lists the .foo files, or warns if there aren't any.

set foos *.foo
if count $foos >/dev/null
    ls $foos
end
# Lists the .foo files, if any.

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

Выходная последовательность команд может использоваться в качестве параметров другой команды. Если параметр содержит набор скобок, текст, заключенный в скобки, будет интерпретироваться как список команд. При расширении этот список выполняется и подставляется на место результата. Если результат содержит более одной строки, каждая строка будет расширена в новый параметр. Установка IFS в пустую строку отключит разделение строк.

Код завершения последней выполненной подстановки команд доступен в переменной status.

Можно использовать только часть результата, см. подстановку диапазона индексов для получения подробностей.

Примеры:

echo (basename image.jpg .jpg).png
# Outputs 'image.png'.

for i in *.jpg; convert $i (basename $i .jpg).png; end
# Convert all JPEG files in the current directory to the
# PNG format using the 'convert' program.

begin; set -l IFS; set data (cat data.txt); end
# Set the `data` variable to the contents of 'data.txt'
# without splitting it into an array.

Расширение фигурных скобок

Список символов, разделенных запятыми, заключённый в фигурные скобки, будет расширен так, что каждый элемент списка станет новым параметром.

Примеры:

echo input.{c,h,txt}
# Outputs 'input.c input.h input.txt'

mv *.{c,h} src/
# Moves all files with the suffix '.c' or '.h' to the subdirectory src.

Расширение переменных

Знак доллара, за которым следует строка символов, расширяется до значения переменной оболочки с тем же именем. Для введения в понятие переменных оболочки прочитайте раздел Переменные оболочки.

Неопределённые и пустые переменные расширяются до ничего.

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

Примеры:

echo $HOME
# Prints the home directory of the current user.

echo $nonexistentvariable
# Prints no output.

echo The plural of $WORD is "$WORD"s
# Prints "The plural of cat is cats" when $WORD is set to cat.
echo The plural of $WORD is {$WORD}s
# ditto

Обратите внимание, что без кавычек или фигурных скобок fish попытается расширить переменную $WORDs, которая может отсутствовать.

Последний синтаксис {$WORD} работает, используя расширение фигурных скобок; следует быть осторожным с массивами переменных и неопределёнными переменными, так как они расширяются как декартово произведение, поэтому неопределённые переменные устраняют строку.

Расширение переменных — единственный тип расширения, выполняемый над строками в двойных кавычках. Однако существует важное различие в том, как переменные расширяются в кавычках и без них. Расширение неоцитированной переменной приведёт к переменной длине аргументов. Например, если переменная $foo имеет нулевое количество элементов или не определена, аргумент $foo расширится до нуля элементов. Если переменная $foo — массив из пяти элементов, аргумент $foo расширится до пяти элементов. При цитировании, как "$foo", расширение переменной всегда приводит к ровно одному аргументу. Неопределённые переменные расширяются до пустой строки, а массивы переменных конкатенируются с использованием пробела.

Есть ещё одна заметная особенность расширения переменных fish. Рассмотрим фрагмент кода:

set foo a b c
set a 10; set b 20; set c 30
for i in (seq (count $$foo))
    echo $$foo[$i]
end

# Output is:
# 10
# 20
# 30

Приведенный код демонстрирует, как использовать несколько символов '$' для расширения значения переменной как имени переменной. Можно считать символ $ оператором разыменования переменной. При использовании этой функции вместе с квадратными скобками массива квадратные скобки всегда будут соответствовать самому внутреннему $ разыменованию. Таким образом, $$foo[5] всегда означает, что следует разыменовать пятый элемент переменной foo, а не пятый элемент двойного разыменованной переменной foo. Последнее можно выразить как $$foo[1][5].

Декартово произведение

Списки, примыкающие к другим спискам или строкам, расширяются как декартовы произведения:

Примеры:

> echo {good,bad}" apples"
good apples bad apples

> set -l a x y z
> set -l b 1 2 3

> echo $a$b
x1 y1 z1 x2 y2 z2 x3 y3 z3

> echo $a"-"$b
x-1 y-1 z-1 x-2 y-2 z-2 x-3 y-3 z-3

> echo {x,y,z}$b
x1 y1 z1 x2 y2 z2 x3 y3 z3

> echo {$b}word
1word 2word 3word

Будьте внимательны, когда вы пытаетесь использовать фигурные скобки для разделения имён переменных от текста. Опасности, отмеченные в последнем примере выше, можно избежать, заключив переменную в двойные кавычки вместо фигурных скобок (echo "$b"word).

Расширение диапазона индексов

Как подстановка команд, так и расширение переменных оболочки поддерживают доступ только к определённым элементам путём предоставления набора индексов в квадратных скобках. Это часто необходимо для доступа к последовательности элементов. Для этого используйте оператор диапазона '..' для этого. Диапазон 'a..b', где пределы диапазона 'a' и 'b' — целые числа, расширяется в последовательность индексов 'a a+1 a+2 ... b' или 'a a-1 a-2 ... b', в зависимости от того, какое из 'a' или 'b' больше. Отрицательные пределы диапазона вычисляются от конца массива или подстановки команд.

Примеры:

# Limit the command substitution output
echo (seq 10)[2..5]
# Uses elements from 2 to 5
# Output is: 2 3 4 5

# Use overlapping ranges:
echo (seq 10)[2..5 1..3]
# Takes elements from 2 to 5 and then elements from 1 to 3
# Output is: 2 3 4 5 1 2 3

# Reverse output
echo (seq 10)[-1..1]
# Uses elements from the last output line to
# the first one in reverse direction
# Output is: 10 9 8 7 6 5 4 3 2 1

То же самое работает при установке или расширении переменных:

# Reverse path variable
set PATH $PATH[-1..1]
# or
set PATH[-1..1] $PATH

# Use only n last items of the PATH
set n -3
echo $PATH[$n..-1]

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

Расширение домашнего каталога

Символ ~ (тильда) в начале параметра, за которым следует имя пользователя, расширяется до домашнего каталога указанного пользователя. Одиночная ~, или ~ , за которой следует слэш, расширяется до домашнего каталога владельца процесса.

Расширение процесса

Символ % (процент) в начале параметра, за которым следует строка, расширяется до идентификатора процесса (PID). Выполняются следующие расширения:

  • Если строка — это всё слово self, результатом будет PID оболочки.
  • В противном случае, если строка — это всё слово last, результатом будет PID последней задачи.
  • В противном случае, если строка — это идентификатор задачи, результатом будет идентификатор группы процессов задачи.
  • В противном случае, если какие-либо дочерние процессы соответствуют указанной строке, их PIDs являются результатом расширения.
  • В противном случае, если какие-либо процессы, принадлежащие пользователю, соответствуют указанной строке, их PIDs являются результатом расширения.
  • Если ни одно из этих соответствий не применимо, генерируется ошибка.

Этот тип расширения полезен для команд, таких как kill и fg, которые принимают идентификаторы процессов в качестве аргументов.

Пример:

fg ema будет искать процесс, командная строка которого начинается с букв 'ema', например emacs, и, если найдёт, выведет его на передний план.

kill -s SIGINT %3 отправит сигнал SIGINT задаче с идентификатором 3.

Объединение различных расширений

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

При объединении нескольких расширений параметров расширения выполняются в следующем порядке:

  • Подстановки команд
  • Расширения переменных
  • Расширение скобок
  • Расширение PID
  • Расширение шаблонов

Расширения выполняются справа налево, вложенные расширения скобок выполняются изнутри наружу.

Пример:

Если в текущем каталоге есть файлы 'foo' и 'bar', команда echo a(ls){1,2,3} выведет 'abar1 abar2 abar3 afoo1 afoo2 afoo3'.

Переменные оболочки

Переменные оболочки — это именованные данные, которые пользователь может создавать, удалять, изменять и использовать. Переменные могут быть по желанию «экспортированы», чтобы копия переменной была доступна любым дочерним процессам, которые создаёт оболочка. Экспортированная переменная называется «переменной окружения».

Для установки значения переменной используйте set команду.

Пример:

Чтобы установить переменную smurf_color со значением blue, используйте команду set smurf_color blue.

После установки переменной вы можете использовать её значение в оболочке через расширение переменных.

Пример:

Чтобы использовать значение переменной smurf, напишите $ (символ доллара) за которым следует имя переменной, например echo Smurfs are usually $smurf_color, что выведет результат 'Гномики обычно голубые'.

Область действия переменных

В fish существуют три вида переменных: универсальные, глобальные и локальные. Универсальные переменные разделяются между всеми сессиями fish, которые пользователь запускает на одном компьютере. Глобальные переменные специфичны для текущей сессии fish, но не связаны с какой-либо областью видимости блока, и никогда не удаляются, пока пользователь явно не запросит это с помощью set -e. Локальные переменные специфичны для текущей сессии fish и связаны с определённым блоком команд и автоматически удаляются при выходе из области видимости конкретного блока. Блок команд — это последовательность команд, начинающаяся с одной из команд for, while, if, function, begin или switch, и заканчивающаяся командой end. Пользователь может указать, что переменная должна иметь глобальную или локальную область видимости, используя переключатели -g/--global или -l/--local.

Переменные могут быть явно установлены как универсальные с помощью переключателей -U или --universal, глобальные с помощью переключателей -g или --global, или локальные с помощью переключателей -l или --local. Правила области видимости при создании или обновлении переменной:

  1. Если переменная явно установлена как универсальная, глобальная или локальная, это значение будет учтено. Если переменная с таким же именем существует в другой области видимости, эта переменная не будет изменена.
  2. Если переменная не установлена явно как универсальная, глобальная или локальная, но ранее была определена, область видимости переменной не изменяется.
  3. Если переменная не установлена явно как универсальная, глобальная или локальная и никогда ранее не определялась, переменная будет локальной для выполняемой в данный момент функции. Обратите внимание, что это отличается от использования флага -l или --local. Если один из этих флагов используется, переменная будет локальной для самого внутреннего выполняемого блока, а без них — локальной для функции. Если функция не выполняется, переменная будет глобальной.

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

Пример:

Следующий код ничего не выведет:

begin
    # This is a nice local scope where all variables will die
    set -l pirate 'There be treasure in them thar hills'
end

echo $pirate
# This will not output anything, since the pirate was local

Универсальные переменные

Универсальные переменные — это переменные, которые используются всеми сессиями fish на компьютере. Fish хранит многие свои параметры конфигурации в качестве универсальных переменных. Это значит, что для изменения настроек fish достаточно изменить значение переменной один раз, и оно будет автоматически обновлено для всех сессий, а также сохранится после перезагрузки компьютера и входа/выхода из системы.

Чтобы увидеть универсальные переменные в действии, запустите две сессии fish рядом и выполните следующую команду в одной из них set fish_color_cwd blue. Так как fish_color_cwd — это универсальная переменная, цвет отображения текущей рабочей директории в приглашении мгновенно изменится на синий в обоих терминалах.

Универсальные переменные хранятся в файле .config/fish/fishd.MACHINE_ID, где MACHINE_ID обычно является вашим MAC-адресом. Не редактируйте этот файл напрямую, так как ваши изменения могут быть перезаписаны. Редактируйте их через скрипты fish или используя fish интерактивно.

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

Область действия переменных для функций

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

Например:

function shiver
    set phrase 'Shiver me timbers'
end

function avast
    set phrase 'Avast, mateys'
    # Calling the shiver function here can not
    # change any variables in the local scope
    shiver
    echo $phrase
end
avast

# Outputs "Avast, mateys"

Экспорт переменных

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

Переменные могут быть явно установлены как экспортируемые с ключом -x или --export, или не экспортируемые с ключом -u или --unexport . Правила экспорта при создании или обновлении переменной идентичны правилам области видимости переменных:

  1. Если переменная явно установлена как экспортируемая или не экспортируемая, это значение будет сохранено.
  2. Если переменная явно не установлена как экспортируемая или не экспортируемая, но была определена ранее, предыдущее правило экспорта переменной сохраняется.
  3. Если переменная явно не установлена как экспортируемая или не экспортируемая и ранее никогда не определялась, переменная не будет экспортирована.

Массивы

fish могут хранить список нескольких строк внутри переменной. Для доступа к одному элементу массива используйте индекс элемента в квадратных скобках, например:

echo $PATH[3]

Обратите внимание, что индексы массива начинаются с 1 в fish, а не с 0, как это более распространено в других языках. Это связано с тем, что многие распространённые утилиты Unix, такие как seq, более подходят для такого использования.

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

for i in $PATH; echo $i is in the path; end

Чтобы создать переменную smurf, содержащую элементы blue и small, просто напишите:

set smurf blue small

Также можно установить или стереть отдельные элементы массива:

# Set smurf to be an array with the elements 'blue' and 'small'
set smurf blue small

# Change the second element of smurf to 'evil'
set smurf[2] evil

# Erase the first element
set -e smurf[1]

# Output 'evil'
echo $smurf

Если вы указываете отрицательный индекс при расширении или присваивании массиву переменной, индекс будет рассчитан с конца массива. Например, индекс -1 означает последний индекс массива.

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

Все массивы одномерные и не могут содержать другие массивы, хотя можно имитировать вложенные массивы, используя правила де-ссылок расширения переменных.

fish автоматически создаёт массивы из переменных PATH, CDPATH и MANPATH при запуске. (Предыдущие версии создавали массивы из всех переменных окружения, разделённых двоеточием.)

Специальные переменные

Пользователь может изменить настройки fish, изменив значения определённых переменных.

  • Большое количество переменных, начинающихся с префиксов fish_color и fish_pager_color. См. Переменные для изменения цветов выделения для получения дополнительной информации.
  • fish_greeting, сообщение приветствия, выводимое при запуске.
  • fish_escape_delay_ms переопределяет значение по умолчанию тайм-аута 300 мс (стандартные сочетания клавиш) или 10 мс (сочетания клавиш vi) после появления escape-символа, прежде чем отказаться от поиска сопоставления сочетания клавиш. См. документацию для встроенной команды bind. Эта задержка обеспечивает использование escape как мета-клавиши.
  • BROWSER, предпочтительный веб-браузер пользователя. Если эта переменная установлена, fish будет использовать указанный браузер вместо системного браузера по умолчанию для отображения документации fish.
  • CDPATH, массив директорий, в которых нужно искать новую директорию для встроенной команды cd. По умолчанию конфигурация fish определяет CDPATH как универсальную переменную со значениями . и ~.
  • LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC и LC_TIME устанавливают параметр языка для оболочки и подпрограмм. См. раздел Локализованные переменные для получения дополнительной информации.
  • fish_user_paths, массив директорий, которые добавляются к PATH. Это может быть универсальная переменная.
  • PATH, массив директорий, в которых нужно искать команды.
  • umask, текущая маска создания файлов. Предпочтительный способ изменения переменной umask — через функцию umask. Попытка установить umask с недопустимым значением всегда завершится неудачей.

fish также предоставляет дополнительную информацию пользователю через значения определённых переменных окружения. Пользователь не может изменить значения большинства из этих переменных.

  • _, имя выполняемой в данный момент команды.
  • argv, массив аргументов оболочки или функции. argv определён только в рамках вызова функции или если fish был вызван со списком аргументов, например, fish myscript.fish foo bar. Эта переменная может быть изменена пользователем.
  • history, массив последних введённых команд.
  • HOME, домашний каталог пользователя. Эта переменная может быть изменена пользователем.
  • IFS, внутренний разделитель полей, который используется для разбиения слов с помощью встроенной команды read. Установка этого значения в пустую строку также отключит разбиение строк в подстановке команд. Эта переменная может быть изменена пользователем.
  • PWD, текущая рабочая директория.
  • status, код возврата последнего завершённого фонового процесса. Если процесс был завершён по сигналу, код возврата будет 128 плюс номер сигнала.
  • USER, текущее имя пользователя. Эта переменная может быть изменена пользователем.
  • CMD_DURATION, время выполнения последней команды в миллисекундах.

Имена этих переменных в основном взяты из семейства оболочек csh и отличаются от тех, которые используются оболочками стиля Bourne, такими как bash.

Переменные с именами в верхнем регистре экспортируются в команды, запущенные fish, а переменные с именами в нижнем регистре — нет. Это правило не проверяется fish, но хорошая практика — использовать регистр для различения экспортированных и неэкспортированных переменных. Fish также использует несколько внутренних переменных. Такие переменные имеют префиксы __FISH или __fish.. Пользователям их использовать не следует. Изменение их значения может привести к сбоям в работе fish.

Переменная статуса

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

Fish хранит код возврата последнего завершённого процесса в переменной status.

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

  • 1 — обычно код возврата встроенных команд fish, если они получили неверные аргументы
  • 124 означает, что команда не была выполнена, потому что ни один из шаблонов подстановки в команде не дал совпадений
  • 125 означает, что хотя исполняемый файл с указанным именем был найден, операционная система не смогла запустить команду
  • 126 означает, что хотя файл с указанным именем был найден, он не был исполняемым
  • 127 означает, что ни функция, ни встроенная команда, ни команда с данным именем не были найдены

Если процесс завершается по сигналу, код возврата будет 128 плюс номер сигнала.

Переменные для изменения цветов выделения

Цвета, используемые fish для синтаксического выделения, можно настроить, изменив значения различных переменных. Значение этих переменных может быть одним из цветов, принятых командой set_color. Также принимаются ключи --bold или -b , принятые set_color.

Для изменения цветов синтаксического выделения в fish доступны следующие переменные:

  • fish_color_normal, цвет по умолчанию
  • fish_color_command, цвет команд
  • fish_color_quote, цвет блоков текста в кавычках
  • fish_color_redirection, цвет перенаправления ввода-вывода
  • fish_color_end, цвет разделителей процессов, таких как ';' и '&'
  • fish_color_error, цвет выделения потенциальных ошибок
  • fish_color_param, цвет стандартных параметров команд
  • fish_color_comment, цвет комментариев кода
  • fish_color_match, цвет выделения соответствующих скобок
  • fish_color_search_match, цвет выделения результатов поиска по истории
  • fish_color_operator, цвет операторов расширения параметров, таких как '*' и '~'
  • fish_color_escape, цвет выделения управляющих символов, таких как '\n' и '\x70'
  • fish_color_cwd, цвет текущей рабочей директории в стандартном приглашении
  • fish_color_autosuggestion, цвет автодополнений
  • fish_color_user, цвет вывода текущего имени пользователя в некоторых стандартных приглашениях fish
  • fish_color_host, цвет вывода текущей системы в некоторых стандартных приглашениях fish

Кроме того, доступны следующие переменные для изменения подсветки в пейджере дополнений:

  • fish_pager_color_prefix, цвет префикса строки, т.е. строки, которая должна быть дополнена
  • fish_pager_color_completion, цвет самого дополнения
  • fish_pager_color_description, цвет описания дополнения
  • fish_pager_color_progress, цвет полосы прогресса в левом нижнем углу
  • fish_pager_color_secondary, цвет фона каждой второй строки дополнения

Пример:

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

set fish_color_error red --bold

Переменные локали

Наиболее распространённый способ установки локали — использование команды типа 'set -x LANG en_GB.utf8', которая устанавливает текущую локаль на английский язык, используемый в Великобритании, с кодировкой UTF-8. Для просмотра списка доступных локалей используйте 'locale -a'.

LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC и LC_TIME устанавливают язык для оболочки и подпрограмм. Эти переменные работают следующим образом: LC_ALL принудительно устанавливает все аспекты локали указанному значению. Если установлена переменная LC_ALL, все остальные переменные локали будут проигнорированы. Другие переменные LC_ устанавливают указанный аспект информации о локали. LANG — это значение по умолчанию, оно будет использовано, если не указаны ни одна из переменных LC_.

Встроенные команды

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

Для просмотра списка всех встроенных команд, функций и команд, поставляемых с fish, см. таблицу содержания. Документация также доступна с помощью опции --help команды.

Редактор командной строки

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

Подобно bash, fish имеет режимы редактирования Emacs и Vi. Режим редактирования по умолчанию — Emacs. Переключиться на режим Vi можно с помощью fish_vi_key_bindings, а обратно — с помощью fish_default_key_bindings.

Команды режима Emacs

  • Tab завершает текущий токен. Shift- Tab завершает текущий токен и запускает режим поиска пейджера.
  • Home или Control-A перемещает курсор в начало строки.
  • End или Control-E перемещает курсор в конец строки. Если курсор уже в конце строки и доступно автодополнение, End или Control-E принимает автодополнение.
  • ← (или Control-B) и → (или Control-F) перемещают курсор влево или вправо на один символ. Если курсор уже в конце строки и доступно автодополнение, нажатие клавиши → и сочетания Control-F принимают предложение.
  • Alt-← и Alt-→ перемещают курсор на одно слово влево или вправо, или перемещают вперёд/назад в истории каталогов, если командная строка пуста. Если курсор уже в конце строки и доступно автодополнение, Alt-→ (или Alt-F) принимает первое слово в предложении.
  • ↑ и ↓ ищут в истории команд предыдущую/следующую команду, содержащую строку, указанную в командной строке до начала поиска. Если командная строка была пустой в момент начала поиска, все команды соответствуют. См. раздел история для получения дополнительной информации о поиске в истории.
  • Alt-↑ и Alt-↓ ищут в истории команд предыдущий/следующий токен, содержащий токен под курсором до начала поиска. Если в момент начала поиска командная строка не находилась на токене, все токены соответствуют. См. раздел история для получения дополнительной информации о поиске в истории.
  • Delete и Backspace удаляют по одному символу вперёд и назад соответственно.
  • Control-C удаляет всю строку.
  • Control-D удаляет один символ справа от курсора. Если командная строка пуста, Control-D завершит работу fish.
  • Control-K перемещает содержимое от курсора до конца строки в killring.
  • Control-U перемещает содержимое от начала строки до курсора в killring.
  • Control-L очищает и перерисовывает экран.
  • Control-W перемещает предыдущий компонент пути (все до предыдущего "/") в killring.
  • Alt-D перемещает следующее слово в killring.
  • Alt-W выводит краткое описание команды под курсором.
  • Alt-L выводит содержимое текущей директории, если курсор не на аргументе директории, то выводится содержимое этой директории.
  • Alt-P добавляет строку '| less;' в конец задания под курсором. В результате, вывод команды будет просматриваться по страницам.
  • Alt-C приводит текущее слово к верхнему регистру.
  • Alt-U приводит текущее слово к верхнему регистру.
  • Alt-H (или F1) отображает страницу справки для текущей команды, если она существует.
  • Control- t меняет местами последние два символа
  • Alt-t меняет местами последние два слова

Вы можете изменить эти сочетания клавиш, используя встроенную команду bind.

Команды режима Vi

Режим Vi позволяет использовать команды Vi в приглашении. Изначально активен режим вставки. Escape переводит в режим команд. Команды, доступные в режимах команд, вставки и визуального режима, описаны ниже. Режим Vi работает поверх режима Emacs, поэтому все сочетания клавиш, упомянутые там, которые не противоречат упомянутым здесь, также работают.

Режим команд Vi

Режим команд также известен как нормальный режим.

  • h перемещает курсор влево.
  • l перемещает курсор вправо.
  • i переходит в режим вставки в текущей позиции курсора.
  • v переходит в режим визуального выделения в текущей позиции курсора.
  • a переходит в режим вставки после текущей позиции курсора.
  • Shift-A переходит в режим вставки в конце строки.
  • 0 (ноль) перемещает курсор в начало строки (оставаясь в режиме команд).
  • dd удаляет текущую строку и перемещает её в killring.
  • Shift-D удаляет текст после текущей позиции курсора и перемещает его в killring.
  • p вставляет текст из killring.
  • u отменяет последнее действие.
  • [ и ] ищут в истории команд предыдущий/следующий токен, содержащий токен под курсором до начала поиска. См. раздел история для получения дополнительной информации о поиске в истории.
  • Control-C удаляет всю строку.

Режим вставки Vi

  • Tab завершает текущий токен.
  • Escape или Control-C переходит в режим команд.
  • ↑ и ↓ ищут в истории команд. См. раздел истории для получения дополнительной информации о поиске в истории.
  • Control-W перемещает предыдущее слово в буфер обмена.
  • Control-U перемещает содержимое от начала строки до курсора в буфер обмена.
  • Control-x перемещает курсор в конец строки. Если доступна автозамена, она будет полностью принята.

Режим визуального редактирования

  • ← и → расширяют выделение назад/вперед на один символ.
  • b и w расширяют выделение назад/вперед на одно слово.
  • d и x перемещают выделение в буфер обмена и переходят в режим команд.
  • Escape и Control-C переходят в режим команд.

Копирование и вставка (Буфер обмена)

fish использует буфер обмена в стиле Emacs для копирования и вставки. Используйте Control-K для вырезания от текущей позиции курсора до конца строки. Вырезанная строка (также известная как убитая) вставляется в связанный список вырезанных фрагментов, называемый буфером обмена. Для вставки последнего значения из буфера обмена используйте Control-Y. После вставки используйте Alt-Y для перехода к предыдущей вставке.

Если переменная среды DISPLAY установлена, и программа xsel установлена, fish попытается подключиться к серверу X Windows, указанному этой переменной, и использовать буфер обмена сервера X для копирования и вставки.

Поисковая история

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

Нажав Alt-↑ и Alt-↓, также выполняется поиск в истории, но вместо поиска по всей команде, каждая команда разбивается на отдельные элементы, как и перед выполнением, и в истории ищется элемент, соответствующий этому элементу под курсором.

Поиск в истории можно прервать, нажав клавишу Escape.

Представление строки команд со пробелом не позволит сохранить всю строку в истории.

История сохраняется в файле ~/.config/fish/fish_history.

Примеры:

Чтобы найти предыдущие записи, содержащие слово 'make', введите make в консоли и нажмите клавишу вверх.

Если в строке команд отображается cd m, поместите курсор на символ m и нажмите Alt-↑, чтобы выполнить поиск ранее введенных слов, содержащих 'm'.

Редактирование многострочных команд

Редактор командной строки fish может использоваться для работы с командами, состоящими из нескольких строк. Существует три способа сделать так, чтобы команда занимала более одной строки:

  • Нажатие клавиши Enter при не закрытом блоке команд, например, когда одна или несколько команд блока, таких как for, begin или if, не имеют соответствующей команды end.
  • Нажатие клавиши Alt-Enter вместо клавиши Enter.
  • Вставка символа обратного слэша (\) перед нажатием клавиши Enter, чтобы избежать перехода на новую строку.

Редактор командной строки fish работает точно так же в однострочном и многострочном режимах. Для перемещения между строками используйте клавиши со стрелками влево и вправо и другие подобные сочетания клавиш.

Запуск нескольких программ

Обычно, когда fish запускает программу, эта программа будет запущена в фоновом режиме, что означает, что она получит контроль над терминалом, а fish будет приостановлен до завершения программы. Иногда это нежелательно. Например, вы можете захотеть запустить приложение с графическим интерфейсом пользователя из терминала и продолжить работу с оболочкой. В таких случаях есть несколько способов изменить поведение fish.

  1. Завершив команду символом & (амперсанд), пользователь сообщает fish поместить указанную команду в фоновый режим. Процесс в фоновом режиме будет выполняться одновременно с fish. fish сохранит контроль над терминалом, поэтому программа не сможет читать с клавиатуры.
  2. Нажав Control-Z, пользователь останавливает текущую программу в фоновом режиме и возвращает контроль fish. Некоторые программы не поддерживают эту функцию или перенаправляют её на другую клавишу. GNU Emacs использует Control-X z для остановки выполнения.
  3. Используя встроенные команды fg и bg, пользователь может переместить любой запущенный процесс в фоновый или передний план.

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

Файлы инициализации

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

Файлы конфигурации оцениваются в следующем порядке:

  • Конфигурация, поставляемая с fish, которую не следует редактировать, обычно /usr/share/fish/config.fish.
  • Системные файлы конфигурации, где администраторы могут включить инициализацию, которая должна выполняться для всех пользователей системы — аналогично /etc/profile для оболочек в стиле POSIX — обычно /etc/fish/config.fish;
  • Фрагменты конфигурации в файлах, оканчивающихся на .fish, в каталогах:

    • ~/.config/fish/conf.d/
    • /etc/fish/conf.d
    • /usr/share/fish/vendor_conf.d

    Если в этих каталогах есть несколько файлов с одинаковым именем, выполнится только первый.

  • Инициализация пользователя, обычно в ~/.config/fish/config.fish (управляется переменной среды XDG_CONFIG_HOME).

Эти пути управляются параметрами, установленным во время сборки, установки или выполнения, и могут отличаться от указанных выше значений по умолчанию.

Этот обширный поиск может быть запутанным. Если вы не уверены, используйте ~/.config/fish/config.fish.

Все эти файлы выполняются при запуске каждой оболочки. Если вы хотите запустить команду только при запуске интерактивной оболочки, используйте код возврата команды status --is-interactive для определения, является ли оболочка интерактивной. Если вы хотите запустить команду только при использовании оболочки входа, используйте status --is-login вместо этого. Это ускорит запуск неинтерактивных или необолочечных оболочек.

Если вы разрабатываете другую программу, вы можете установить конфигурацию, которая выполняется для всех пользователей оболочки fish в системе. Это не рекомендуется; если они не написаны тщательно, они могут иметь побочные эффекты или замедлить запуск оболочки. Кроме того, пользователи других оболочек не получат выгоды от конфигурации, специфичной для Fish. Однако, если они абсолютно необходимы, вы можете установить их в каталог конфигурации "vendor". Поскольку этот путь может отличаться в зависимости от системы, для определения этого пути с выводом pkg-config --variable confdir fish следует использовать структуру pkgconfig.

Примеры:

Если вы хотите добавить каталог ~/linux/bin в переменную PATH при использовании оболочки входа, добавьте следующее в свой файл ~/.config/fish/config.fish:

if status --is-login
    set PATH $PATH ~/linux/bin
end

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

function on_exit --on-process %self
    echo fish is now exiting
end

Другие функции

Синтаксическое выделение

fish интерпретирует командную строку по мере ввода и использует синтаксическое выделение для предоставления обратной связи пользователю. Самая важная обратная связь — это обнаружение потенциальных ошибок. По умолчанию ошибки отмечаются красным цветом.

Обнаруженные ошибки включают:

  • Несуществующие команды.
  • Чтение из или добавление в несуществующий файл.
  • Неправильное использование перенаправления вывода
  • Несоответствующие скобки

Когда курсор находится над скобкой или кавычкой, fish также выделяет соответствующую кавычку или скобку.

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

Программируемое заголовок

При использовании большинства виртуальных терминалов можно установить сообщение, отображаемое в строке заголовка окна терминала. Это можно сделать автоматически в fish, определив функцию fish_title. Функция fish_title выполняется до и после выполнения новой команды или помещения в передний план, и вывод используется как сообщение строки заголовка. Переменная окружения $_ всегда будет содержать имя задачи, которая должна быть переведена в передний план (или 'fish', если управление возвращается оболочке) при вызове функции fish_prompt. Первый аргумент fish_title будет содержать последнюю выполненную команду в фоновом режиме в виде строки, начиная с fish 2.2.

Примеры: Титульный символ fish по умолчанию:

function fish_title
    echo $_ ' '
    pwd
end

Чтобы отобразить последнюю команду в заголовке:

function fish_title
    echo $argv[1]
end

Настраиваемое приветствие

Если существует функция с именем fish_greeting, она будет запущена при входе в интерактивный режим. В противном случае, если существует переменная окружения с именем fish_greeting, она будет напечатана.

Обработчики событий

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

  • При получении сигнала
  • При завершении процесса или задачи
  • При обновлении значения переменной
  • При появлении приглашения
  • При неудачном поиске команды

Пример:

Для задания обработчика сигнала WINCH, напишите:

function --on-signal WINCH my_signal_handler
    echo Got WINCH signal!
end

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

Для получения дополнительной информации о том, как определять новые обработчики событий, см. документацию по команде function.

Отладка скриптов fish

Fish включает встроенный отладчик. Отладчик позволяет остановить выполнение скрипта в произвольной точке и запустить приглашение. Это приглашение можно использовать для проверки или изменения значения любых переменных или выполнения любой команды оболочки. Чтобы возобновить нормальное выполнение скрипта, просто выйдите из приглашения.

Для запуска отладчика просто вызовите встроенную команду breakpoint. По умолчанию сигнал TRAP вызывает эту встроенную команду, поэтому запущенный скрипт можно отладить, отправив ему сигнал TRAP. После входа в отладчик легко вставить новые точки останова, используя функцию funced для редактирования определения функции.

Общие проблемы с fish

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

Дополнительная помощь и разработка

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

  1. Официальный список рассылки по адресу fish-users@lists.sourceforge.net
  2. Канал IRC, #fish на irc.oftc.net
  3. Страница проекта GitHub по адресу https://github.com/fish-shell/fish-shell/

Если у вас есть улучшение для fish, вы можете отправить его по почте или на страницу GitHub.

© 2005–2009 Axel Liljencrantz
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/2.3/index.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API