Документация
Введение
Это документация для 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— буква алфавита, представляет управляющую последовательность, генерируемую при нажатии клавиши «Control» и указанной буквы. Например,\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' или '^?DESTINATION'
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, а любые ошибки будут отображаться с помощью менее страницы.
Задачи в фоновом режиме
Когда вы запускаете задачу в fish, fish само приостановится и передаст управление терминалом только что запущенной программе. Иногда вы хотите продолжить использование командной строки и запустить задачу в фоновом режиме. Для создания задачи в фоновом режиме добавьте & (амперсанд) к вашей команде. Это сообщит fish о запуске задачи в фоновом режиме. Задачи в фоновом режиме очень полезны при работе с программами, имеющими графический пользовательский интерфейс.
Пример:
emacs &
запустит текстовый редактор emacs в фоновом режиме.
Управление задачами
Большинство программ позволяют приостановить выполнение программы и вернуть управление fish, нажав Управление-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 не может знать, что функция должна быть выполнена при возникновении события, если она ещё не загружена. Для получения дополнительной информации см. раздел обработчики событий.
Автозагрузка не применима к функциям, созданным командой alias. Для достаточно простых функций, которые вы предпочитаете определять с помощью команды alias, вам нужно поместить эти команды в ваш скрипт ~/.config/fish/config.fish или какой-либо другой скрипт, выполняемый при запуске оболочки.
Если вы разрабатываете другую программу, вы можете захотеть установить функции, доступные всем пользователям оболочки fish в системе. Их можно установить в каталог функций "vendor". Поскольку этот путь может различаться в зависимости от системы, для обнаружения этого пути с выводом pkg-config --variable functionsdir fish необходимо использовать структуру pkgconfig.
Условное выполнение кода и управление потоком
Существует четыре встроенные команды 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).
Для принятия автодополнения (заменяя содержимое командной строки) нажмите правую стрелку или Управление-F. Для принятия первого предложенного слова нажмите Alt-→ или Alt-F. Если автодополнение вам не подходит, просто его игнорируйте: оно не будет выполнено, пока вы его не примите.
Автодополнение — мощный способ быстро вызвать часто используемые команды, введя первые несколько символов. Это также эффективный метод навигации по иерархии каталогов.
Автодополнение по нажатию клавиши табуляции
Автодополнение по нажатию клавиши табуляции — одна из самых экономичных функций любой современной оболочки. Нажав клавишу табуляции, пользователь просит fish угадать остальную часть команды или параметра, который пользователь вводит в данный момент. Если fish найдёт только одно возможное дополнение, fish его выведет. Если существует более одного дополнения, fish выведет самый длинный общий префикс всех дополнений. Если дополнения различаются по первому символу, печатается список всех возможных дополнений. В списке приведены описания дополнений, и если список не помещается на экране, его можно прокручивать с помощью клавиш со стрелками, клавиш Page Up/Page Down, клавиши Tab или клавиши пробела. После ввода списка нажатие любой другой клавиши начнёт поиск. Если список не введён, нажатие любой другой клавиши завершит список и вставит нажатую клавишу в командную строку.
Это общие дополнения по нажатию клавиши табуляции, которые предоставляет fish:
- Выполнение команд (встроенные команды, функции и обычные программы).
- Выполнение имен переменных оболочки.
- Выполнение имён пользователей для подстановки тильды.
- Выполнение имён файлов, даже в строках с подстановками, таких как '
*', '**' и '?'. - Выполнение идентификаторов задач, имён задач и имён процессов для подстановки процессов.
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выполняет завершение файла для STRING, разрешая только файлы, оканчивающиеся на SUFFIX, с необязательным описанием. -
__fish_complete_usersвыводит список всех пользователей с их полными именами в качестве описания. -
__fish_print_filesystemsвыводит список всех известных файловых систем. В настоящее время это статический список, и он не зависит от того, какие файловые системы на самом деле понимает операционная система хоста. -
__fish_print_hostnamesвыводит список всех известных хост-имён. Эта функция ищет в fstab nfs-серверы, в known_hosts ssh и проверяет файл/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". Поскольку этот путь может различаться на различных системах, следует использовать фреймворк pkgconfig для поиска этого пути с выводом pkg-config --variable completionsdir fish.
Подстановка параметров (Подстановка шаблонов)
Когда аргумент программы задаётся в командной строке, он проходит процесс подстановки параметров перед передачей команде. Подстановка параметров — мощный механизм, который позволяет расширить параметр различными способами, включая выполнение сопоставления шаблонов файлов, вставку значения переменной оболочки в параметр или даже использование вывода другой команды как списка параметров.
Шаблоны
Если в параметре присутствует звёздочка (*) или знак вопроса (?), 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 последней задачи. - В противном случае, если строка — ID задачи, результатом будет идентификатор группы процессов задачи.
- В противном случае, если какие-либо дочерние процессы соответствуют указанной строке, их PID является результатом расширения.
- В противном случае, если какие-либо процессы, принадлежащие пользователю, соответствуют указанной строке, их PID является результатом расширения.
- Если ни одно из этих соответствий не применимо, выдаётся ошибка.
Эта форма расширения полезна для команд, таких как 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. Правила области действия при создании или обновлении переменной:
- Если переменная явно задана как универсальная, глобальная или локальная, это задание будет выполнено. Если переменная с тем же именем существует в другой области действия, эта переменная не изменится.
- Если переменная не явно задана как универсальная, глобальная или локальная, но была определена ранее, область действия переменной не изменится.
- Если переменная не явно задана как универсальная, глобальная или локальная и никогда ранее не была определена, переменная будет локальной для выполняемой в данный момент функции. Обратите внимание, что это отличается от использования флага
-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. Правила экспорта при создании или обновлении переменной идентичны правилам области видимости переменных:
- Если переменная явно задана как экспортируемая или не экспортируемая, это значение будет учтено.
- Если переменная не явно задана как экспортируемая или не экспортируемая, но была определена ранее, предыдущее правило экспорта для переменной сохраняется.
- Если переменная не явно задана как экспортируемая или не экспортируемая и ранее не была определена, переменная не будет экспортирована.
Массивы
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. -
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, время выполнения последней команды в миллисекундах. -
FISH_VERSION, версия текущей запущенной fish -
COLUMNS, текущая ширина терминала -
LINES, текущая высота терминала -
SHLVL, уровень вложенности оболочек
Названия этих переменных в основном взяты из семейства оболочек csh и отличаются от используемых оболочками стиля Bourne, такими как bash.
Переменные, имена которых написаны заглавными буквами, экспортируются в команды, запущенные fish, а переменные, написанные строчными буквами, не экспортируются. Это правило не проверяется fish, но использование регистра для различения экспортируемых и неэкспортируемых переменных — хорошая практика программирования. fish также использует несколько внутренних переменных. Такие переменные имеют префиксы __FISH или __fish.. Пользователям никогда не следует их использовать. Изменение их значений может привести к поломке fish.
Переменная состояния
Всякий раз, когда процесс завершается, ему возвращается код завершения программе, которая его запустила (обычно оболочке). Этот код завершения — целое число, которое сообщает вызывающему приложению, как прошла работа команды. В общем случае код завершения 0 означает, что команда выполнилась без проблем, а ненулевой код завершения означает наличие проблемы.
Fish хранит код завершения последнего процесса в последней работе, завершившейся, в переменной status.
Если fish сталкивается с проблемой при выполнении команды, переменная состояния также может быть установлена в определённое значение:
- 1 — это, как правило, код завершения команд fish, если они были предоставлены с недопустимыми аргументами.
- 123 означает, что команда не была выполнена, потому что имя команды содержало недопустимые символы.
- 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. Также можно создавать собственные сочетания клавиш, создавая функцию и устанавливая $fish_key_bindings в ее имя. Например:
function hybrid_bindings --description "Vi-style bindings that inherit emacs-style bindings in all modes"
for mode in default insert visual
fish_default_key_bindings -M $mode
end
fish_vi_key_bindings --no-erase
end
set -g fish_key_bindings hybrid_bindings
Общие сочетания
Некоторые сочетания клавиш общие для режимов emacs и vi, так как они не являются сочетаниями для редактирования текста или потому, что то, что делает Vi/Vim для определённой клавиши, не имеет смысла для оболочки.
- Tab завершает текущий токен. Shift- Tab завершает текущий токен и запускает режим поиска в просмотрщике.
- Alt-← и Alt-→ перемещают курсор влево или вправо на одно слово, или перемещают вперёд/назад в истории каталогов, если командная строка пустая. Если курсор уже находится в конце строки и доступна автозамена, Alt-→ (или Alt-F) принимает первое слово в предложении.
- ↑ и ↓ ищут в истории команд предыдущую/следующую команду, содержащую строку, указанную в командной строке до начала поиска. Если командная строка была пустой при старте поиска, все команды соответствуют. Более подробную информацию о поиске в истории см. в разделе история.
- Alt-↑ и Alt-↓ ищут в истории команд предыдущий/следующий токен, содержащий токен под курсором до начала поиска. Если командная строка не находилась на токене во время начала поиска, все токены соответствуют. Более подробную информацию о поиске в истории см. в разделе история.
- Control-C отменяет всю строку.
- Control-D удаляет один символ справа от курсора. Если командная строка пустая, Control-D выйдет из fish.
- Control-U перемещает содержимое от начала строки до курсора в буфер обмена.
- Control-L очищает и перерисовывает экран.
- Control-W перемещает предыдущий компонент пути (все до предыдущей "/") в буфер обмена.
- Control-X копирует текущий буфер в буфер обмена системы, Control-V вставляет содержимое буфера обмена.
- Alt-d перемещает следующее слово в буфер обмена.
- Alt-h (или F1) отображает страницу справки для текущей команды, если она существует.
- Alt-l выводит содержимое текущей директории, если курсор не находится над аргументом директории, в противном случае выводится содержимое этой директории.
-
Alt-p добавляет строку '
| less;' в конец задания под курсором. В результате вывод команды будет просмотрен в просмотрщике страниц. - Alt-w выводит краткое описание команды под курсором.
-
Alt-e редактирует текущую командную строку в внешнем редакторе. Редактор выбирается из первого доступного из переменных
$VISUALили$EDITOR. - Alt-v То же, что и Alt-e.
Команды режима Emacs
- Home или Control-A перемещает курсор в начало строки.
- End или Control-E перемещает курсор в конец строки. Если курсор уже находится в конце строки и доступна автозамена, End или Control-E принимает автозамену.
- ← (или Control-B) и → (или Control-F) перемещают курсор влево или вправо на один символ. Если курсор уже находится в конце строки и доступна автозамена, клавиша → и сочетание Control-F принимают предложение.
- Удалить и Backspace удаляют один символ вперёд или назад соответственно.
- Control-K перемещает содержимое от курсора до конца строки в буфер обмена.
- Alt-c приводит текущее слово к верхнему регистру.
- Alt-u переводит текущее слово в верхний регистр.
- Control-t меняет местами последние два символа.
- Alt-t меняет местами последние два слова.
Эти сочетания клавиш можно изменить с помощью встроенной команды bind.
Команды режима Vi
Режим Vi позволяет использовать команды Vi в командной строке. Изначально активен режим вставки (insert mode). Escape переходит в режим команды (command mode). Команды, доступные в режимах команды, вставки и визуального режима, описаны ниже. Режим Vi использует некоторые сочетания с режимом Emacs.
Также можно добавить все сочетания режима emacs в режим vi, используя что-то вроде
function fish_user_key_bindings
# Execute this once per mode that emacs bindings should be used in
fish_default_key_bindings -M insert
# Without an argument, fish_vi_key_bindings will default to
# resetting all bindings.
# The argument specifies the initial mode (insert, "default" or visual).
fish_vi_key_bindings insert
end
В режиме vi функция fish_mode_prompt отобразит индикатор режима слева от приглашения. Функция fish_vi_cursor будет использоваться для изменения формы курсора в зависимости от режима в поддерживаемых терминалах. Чтобы отключить эту функцию, переопределите ее пустой функцией. Чтобы отобразить режим в другом месте (например, в правом приглашении), используйте результат функции fish_default_mode_prompt.
Режим команды
Режим команды также известен как нормальный режим.
- h перемещает курсор влево.
- l перемещает курсор вправо.
- i переходит в режим вставки (insert mode) в текущей позиции курсора.
- v переходит в визуальный режим (visual mode) в текущей позиции курсора.
- a переходит в режим вставки (insert mode) после текущей позиции курсора.
- Shift-A переходит в режим вставки (insert mode) в конце строки.
- 0 (ноль) перемещает курсор в начало строки (оставаясь в режиме команды).
- dd удаляет текущую строку и перемещает её в буфер обмена.
- Shift-D удаляет текст после текущей позиции курсора и перемещает его в буфер обмена.
- p вставляет текст из буфера обмена.
- u отменяет последнее действие.
- [ и ] ищут в истории команд предыдущий/следующий токен, содержащий токен под курсором до начала поиска. Более подробную информацию о поиске в истории см. в разделе история.
- Backspace перемещает курсор влево.
Режим вставки
- Escape переходит в режим команды (command mode).
- Backspace удаляет один символ слева.
Визуальный режим
- ← и → расширяют выделение назад/вперёд на один символ.
- b и w расширяют выделение назад/вперёд на одно слово.
- d и x перемещают выделение в буфер обмена и переходят в режим команды.
- Escape и Control-C переходят в режим команды.
Копирование и вставка (Буфер обмена)
fish использует буфер обмена в стиле Emacs для функциональности копирования и вставки. Используйте Control-K, чтобы вырезать от текущей позиции курсора до конца строки. Вырезанная строка (также называемая убитой строкой) вставляется в связанный список вырезов, называемый буфером обмена. Чтобы вставить последнее значение из буфера обмена, используйте Control-Y. После вставки используйте Alt-Y, чтобы перейти к предыдущему вырезу.
Поисковая история
После ввода команды она вставляется в конец списка истории. Любые дублируемые элементы истории автоматически удаляются. Нажимая клавиши вверх и вниз, пользователь может искать вперёд и назад в истории. Если текущая командная строка не пустая при поиске в истории, отображаются только команды, содержащие строку, введенную в командную строку.
Нажав Alt-↑ и Alt-↓, выполняется поиск в истории, но вместо поиска по всей командной строке, каждая командная строка разбивается на отдельные элементы, как и перед выполнением, и история просматривается на предмет совпадения элемента, соответствующего элементу под курсором.
Поиск в истории можно прервать, нажав клавишу Esc.
Добавление пробела в начало командной строки предотвратит сохранение всей строки в истории.
История хранится в файле ~/.local/share/fish/fish_history (или $XDG_DATA_HOME/fish/fish_history, если эта переменная установлена).
Примеры:
Для поиска предыдущих записей, содержащих слово «make», введите make в консоли и нажмите клавишу вверх.
Если командная строка выглядит как cd m, поместите курсор над символом m и нажмите Alt-↑, чтобы найти ранее вводимые слова, содержащие «m».
Редактирование многострочных команд
Редактор командной строки fish может использоваться для работы с командами, состоящими из нескольких строк. Существует три способа сделать команду многострочной:
- Нажатие клавиши Enter при незакрытом блоке команд, например, когда одна или несколько командных блоков, таких как
for,beginилиif, не имеют соответствующей командыend. - Нажатие Alt-Enter вместо нажатия клавиши Enter.
- Вставка символа обратной косой черты (
\) перед нажатием клавиши Enter, чтобы избежать перехода на новую строку.
Редактор командной строки fish работает одинаково в однострочном и многострочном режимах. Для перемещения между строками используйте клавиши со стрелками влево и вправо и другие подобные сочетания клавиш.
Запуск нескольких программ
Обычно, когда fish запускает программу, эта программа выводится на передний план, что означает, что она получает управление терминалом, и fish останавливается до завершения программы. Иногда это нежелательно. Например, вы можете захотеть запустить приложение с графическим интерфейсом пользователя из терминала и продолжить использование оболочки. В таких случаях существует несколько способов изменить поведение fish.
- Завершив команду символом
&(амперсанд), пользователь сообщаетfish, чтобы поместить указанную команду в фоновый режим. Процесс в фоновом режиме будет выполняться одновременно сfish.fishсохранит контроль над терминалом, поэтому программа не сможет считывать данные с клавиатуры. - Нажав Control-Z, пользователь останавливает текущую выполняющуюся программу в фоновом режиме и возвращает контроль
fish. Некоторые программы не поддерживают эту функцию или переназначают её на другую клавишу. GNU Emacs использует Control-X z для остановки выполнения. - Используя встроенные команды
fgиbg, пользователь может переместить любой текущий процесс в фоновый или передний план.
Обратите внимание, что функции не могут быть запущены в фоновом режиме. Функции, которые были остановлены и затем перезапущены в фоновом режиме с использованием команды bg, не будут выполняться правильно.
Файлы инициализации
При запуске Fish оценивает ряд файлов конфигурации, которые могут использоваться для управления поведением оболочки. Расположение этих файлов конфигурации контролируется рядом переменных среды, а их стандартное расположение приведено ниже.
Файлы конфигурации оцениваются в следующем порядке:
- Конфигурация, поставляемая с fish, которую не следует редактировать, в
$__fish_datadir/config.fish(обычно/usr/share/fish/config.fish). - Файлы конфигурации системы, где администраторы могут включать инициализацию, которая должна выполняться для всех пользователей в системе — подобно
/etc/profileдля оболочек в стиле POSIX — в$__fish_sysconfdir(обычно/etc/fish/config.fish); -
Фрагменты конфигурации в файлах, оканчивающихся на
.fish, в каталогах:-
$XDG_CONFIG_HOME/fish/conf.d(по умолчанию~/.config/fish/conf.d/) -
$__fish_sysconfdir/conf.d(по умолчанию/etc/fish/conf.d) -
/usr/share/fish/vendor_conf.d(устанавливается во время компиляции; по умолчанию$__fish_datadir/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 -x 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 ожидает ввода, он будет отображать подсказку, оценивая функции fish_prompt и fish_right_prompt. Вывод первого отображается слева, а вывод второго — справа в терминале. Вывод fish_mode_prompt будет предварять слева, хотя по умолчанию функция делает это только в режиме vi-режима.
Настраиваемое приветствие
Если существует функция с именем fish_greeting, она будет выполняться при входе в интерактивный режим. В противном случае, если существует переменная среды с именем fish_greeting, она будет выведена.
Обработчики событий
При определении новой функции в fish её можно сделать обработчиком события, т.е. функцией, которая автоматически выполняется при возникновении определённого события. События, которые могут вызывать обработчик, на данный момент:
- При поступлении сигнала
- При выходе процесса или задачи
- При обновлении значения переменной
- При отображении подсказки
- При неудачном поиске команды
Пример:
Чтобы задать обработчик сигнала для сигнала WINCH, напишите:
function --on-signal WINCH my_signal_handler
echo Got WINCH signal!
end
Обратите внимание, что обработчики событий активируются только при загрузке функции, что означает, что вам может потребоваться выполнить действие source или execute, чтобы загрузить функцию, вместо того, чтобы полагаться на автозагрузку автозагрузку. Один из подходов — поместить её в свой файл инициализации.
Дополнительную информацию о том, как определить новые обработчики событий, см. в документации для команды function.
Отладка сценариев fish
Fish включает встроенный отладчик. Отладчик позволяет остановить выполнение сценария в произвольной точке и запустить приглашение. Это приглашение можно использовать для проверки или изменения значения переменных или выполнения любой команды shellscript. Для продолжения нормального выполнения сценария достаточно выйти из приглашения.
Чтобы запустить отладчик, просто вызовите встроенную команду breakpoint. Действие сигнала TRAP по умолчанию заключается в вызове этой встроенной команды, поэтому работающий сценарий можно отладить, отправив ему сигнал TRAP. После входа в отладчик легко вставить новые точки останова, используя функцию funced для редактирования определения функции.
Распространённые проблемы с fish
Если вы устанавливаете fish в домашнем каталоге, fish не будет работать корректно для других пользователей, кроме вас. Это происходит потому, что fish нуждается в своих файлах инициализации для правильной работы. Чтобы решить эту проблему, либо скопируйте файлы инициализации в домашний каталог каждого пользователя fish, либо установите их в /etc.
Дополнительная помощь и разработка
Если у вас есть вопрос, на который не отвечает эта документация, существуют несколько способов получить помощь:
- Официальный список рассылки по адресу fish-users@lists.sourceforge.net
- Канал IRC #fish на
irc.oftc.net - Страница проекта 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.5/index.html