Документация
Введение
Это документация для 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' представляет символ escape - '
\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— буква алфавита, представляет управляющую последовательность, генерируемую при нажатии клавиши Ctrl и указанной буквы. Например,\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, а любые ошибки будут отображены с помощью пейджера 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. Вы не можете выполнить автозагрузку алиасов.
Для простого создания функции такого типа вы можете использовать команду 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).
Для принятия автодополнения (заменяющего содержимое командной строки) нажмите правую стрелку или Control-F. Для принятия первого предложенного слова нажмите Alt-→ или Alt-F. Если автодополнение не то, что вам нужно, просто проигнорируйте его: оно не будет выполнено, пока вы его не примете.
Автодополнение — мощный способ быстро вызвать часто вводимые команды, набрав первые несколько символов. Это также эффективный способ перемещаться по иерархии каталогов.
Автодополнение с помощью Tab
Автозаполнение — одна из самых экономичных функций любой современной оболочки. Нажав клавишу Tab, пользователь просит 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выполняет автозаполнение файлов, разрешая только файлы, оканчивающиеся на SUFFIX, с необязательным описанием. -
__fish_complete_usersвыводит список всех пользователей с полным именем в качестве описания. -
__fish_print_filesystemsвыводит список всех известных файловых систем. В настоящее время это статический список, не зависящий от того, какие файловые системы фактически понимает хостовая операционная система. -
__fish_print_hostnamesвыводит список всех известных имён хостов. Эта функция ищет nfs-серверы в fstab, ssh-хосты в 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, чтобы сопоставить файлы как в текущем рабочем каталоге, так и в подкаталогах.
Другие оболочки, такие как 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 последней задачи является результатом. - В противном случае, если строка — это идентификатор задачи, результатом является идентификатор группы процессов задачи.
- В противном случае, если какие-либо дочерние процессы соответствуют указанной строке, их 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'.
Имена переменных и функций оболочки
Имена, присваиваемые объектам оболочки, таким как переменные и имена функций, известны как «идентификаторы». Каждый тип идентификатора имеет правила, определяющие допустимую последовательность символов, составляющих идентификатор.
Имя переменной не может быть пустым. Оно может содержать только буквы, цифры и символы подчёркивания. Оно может начинаться и заканчиваться любым из этих символов.
Имя функции не может быть пустым. Оно не может начинаться с дефиса («-») и не может содержать слэша («/»). Все остальные символы, включая пробел, допустимы.
Имя режима привязки (например, bind -m abc ...) ограничено правилами для допустимых имён переменных.
Переменные оболочки
Переменные оболочки — это именованные фрагменты данных, которые могут быть созданы, удалены, а их значения изменены и использованы пользователем. Переменные могут быть необязательно «экспортированы», чтобы копия переменной была доступна для любых дочерних процессов, созданных оболочкой. Экспортированная переменная называется «переменной среды».
Для установки значения переменной используйте команду set. Имя переменной не может быть пустым и может содержать только буквы, цифры и символы подчёркивания. Оно может начинаться и заканчиваться любым из этих символов.
Пример:
Для установки переменной smurf_color в значение blue используйте команду set smurf_color blue.
После установки переменной вы можете использовать значение переменной в оболочке с помощью расширения переменных.
Пример:
Чтобы использовать значение переменной smurf_color, напишите $ (символ доллара) за которым следует имя переменной, как в 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_escape_delay_msпереопределяет стандартный таймаут 300 мс (стандартные сочетания клавиш) или 10 мс (сочетания клавиш vi) после получения символа обратного слэша, прежде чем отказаться от сопоставления сочетания клавиш. См. документацию для встроенной команды bind. Эта задержка позволяет использовать обратный слэш как модификатор. -
fish_greeting, сообщение приветствия, выводимое при запуске. -
fish_history, текущее имя сеанса истории. Если установлено, все последующие команды в интерактивном сеансе Fish будут регистрироваться в отдельном файле, определённом значением переменной. Если не задано или задано значениеdefault, используется стандартное имя сеанса "fish". Если задано пустое значение, история не сохраняется на диск (но доступна в интерактивном сеансе). -
fish_user_paths, массив каталогов, добавляемых передPATH. Это может быть универсальная переменная. -
umask, текущая маска создания файла. Предпочтительный способ изменения переменной umask — использование функции umask. Попытка установить umask в недопустимое значение всегда завершается неудачей. -
BROWSER, предпочтительный веб-браузер пользователя. Если эта переменная установлена, Fish будет использовать указанный браузер вместо системного по умолчанию для отображения документации Fish. -
CDPATH, массив каталогов, в которых следует искать новый каталог для встроенной командыcd. -
LANG,LC_ALL,LC_COLLATE,LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERICиLC_TIMEустанавливают параметр языка для оболочки и подпрограмм. Подробнее см. раздел Переменные локали. -
PATH, массив каталогов, в которых следует искать команды
fish также предоставляет пользователю дополнительную информацию через значения определённых переменных среды. Пользователь не может изменить значения большинства из этих переменных.
-
_, имя выполняемой в данный момент команды. -
argv, массив аргументов для оболочки или функции.argvопределена только при вызове функции или если Fish был вызван со списком аргументов, например,fish myscript.fish foo bar. Эта переменная может быть изменена пользователем. -
history, массив последних введённых команд. -
HOME, домашний каталог пользователя. Эта переменная может быть изменена пользователем. -
IFS, внутренний разделитель полей, используемый для разделения слов с помощью встроенной команды read. Установка этого значения в пустую строку также отключит разделение строк в подстановке команд. Эта переменная может быть изменена пользователем. -
PWD, текущая рабочая директория. -
status, код завершения последнего фонового процесса. Если процесс был завершён по сигналу, код завершения будет равен 128 плюс номер сигнала. -
USER, текущее имя пользователя. Эта переменная может быть изменена пользователем. -
CMD_DURATION, время выполнения последней команды в миллисекундах. -
FISH_VERSION, версия работающей в данный момент Fish. -
SHLVL, уровень вложенности оболочек. -
COLUMNSиLINES, текущий размер терминала по высоте и ширине. Эти значения используются Fish только если операционная система не сообщает размер терминала. В этом случае обе переменные должны быть установлены, иначе будет использоваться значение по умолчанию 80x24. Они обновляются при изменении размера окна.
Названия этих переменных в основном взяты из семейства оболочек csh и отличаются от используемых оболочками стиля Bourne, такими как bash.
Переменные с заглавными буквами экспортируются в команды, запускаемые Fish, а переменные со строчными буквами не экспортируются. Это правило не принудительно, но рекомендуется использовать разный регистр для различения экспортируемых и неэкспортируемых переменных. fish также использует несколько внутренних переменных. Такие переменные имеют префикс __FISH или __fish.. Пользователь не должен использовать их. Изменение их значения может нарушить работу Fish.
Переменная статуса
Всякий раз, когда процесс завершается, возвращается код завершения программе, которая его запустила (обычно оболочке). Этот код завершения — целое число, которое сообщает вызывающему приложению, как прошла работа команды. В общем случае нулевой код завершения означает, что команда выполнилась без ошибок, а ненулевой — что произошла ошибка.
Fish хранит код завершения последнего процесса в переменной status.
Если fish сталкивается с проблемой при выполнении команды, переменная статуса может быть также установлена в определённое значение:
- 0 — обычно, код завершения команд fish, если они успешно выполнили запрошенную операцию.
- 1 — обычно, код завершения команд fish, если они не смогли выполнить запрошенную операцию.
- 121 — обычно, код завершения команд 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_color_host, цвет, используемый для вывода текущей системы в некоторых командных строках по умолчанию -
fish_color_cancel, цвет для индикатора '^C' при отмене команды
Кроме того, следующие переменные доступны для изменения выделения в пейджере завершения:
-
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) принимает первое слово из предложения.
- ↑ и ↓ (или Control-P и Control-N для любителей Emacs) ищут в истории команд предыдущую/следующую команду, содержащую строку, заданную в командной строке до начала поиска. Если командная строка была пуста при старте поиска, все команды совпадают. См. раздел история для получения дополнительной информации о поиске в истории.
- 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 примет предложение.
- Delete и Backspace удаляют символ вперёд или назад соответственно.
- Control-K перемещает содержимое от курсора до конца строки в буфер обмена.
- Alt-c приводит текущее слово к верхнему регистру.
- Alt-u приводит текущее слово к верхнему регистру.
- Control-t меняет местами два последних символа.
- Alt-t меняет местами два последних слова.
Вы можете изменить эти сочетания клавиш, используя встроенную команду bind.
Команды режима Vi
Режим Vi позволяет использовать команды, похожие на Vi, в командной строке. Изначально активен режим вставки. Esc переключает в командный режим. Команды, доступные в командном, режиме вставки и визуальном режиме, описаны ниже. Режим Vi использует некоторые сочетания клавиш с режимом Emacs.
Также можно добавить все сочетания клавиш из режима emacs-mode в режим vi-mode, используя что-то вроде
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 переходит в режим вставки в текущей позиции курсора.
- v переходит в визуальный режим в текущей позиции курсора.
- a переходит в режим вставки после текущей позиции курсора.
- Shift-A переходит в режим вставки в конце строки.
- 0 (ноль) перемещает курсор в начало строки (оставаясь в командном режиме).
- dd удаляет текущую строку и перемещает её в буфер обмена.
- Shift-D удаляет текст после текущей позиции курсора и перемещает его в буфер обмена.
- p вставляет текст из буфера обмена.
- u просмотр истории команд в обратном порядке.
- [ и ] поиск в истории команд по предыдущему/следующему элементу, содержащему символ под курсором до начала поиска. Подробности о поиске в истории см. в разделе история.
- Backspace перемещает курсор влево.
Режим вставки
- Esc переходит в командный режим.
- Backspace удаляет один символ слева.
Визуальный режим
- ← и → расширяют выделение назад/вперед на один символ.
- b и w расширяют выделение назад/вперед на одно слово.
- d и x перемещают выделение в буфер обмена и переходят в командный режим.
- Esc и Control-C переходят в командный режим.
Копирование и вставка (Буфер обмена)
fish использует буфер обмена в стиле Emacs для копирования и вставки. Используйте Control-K для вырезания текста от текущей позиции курсора до конца строки. Вырезанная строка (т. е. убитая) добавляется в связанный список вырезок, называемый буфером обмена. Для вставки последнего значения из буфера обмена используйте Control-Y. После вставки используйте Alt-Y для перехода к предыдущей вырезке.
Также поддерживается копирование и вставка извне, как через сочетания Control-X / Control-V, так и через функцию вставки терминала, для которой fish включает режим "Бракетированная вставка". При вставке внутри одинарных кавычек вставленные одинарные кавычки и обратные слэши автоматически экранируются, чтобы результат можно было использовать как один токен, просто закрыв кавычку после.
Поиск в истории
После ввода команды она добавляется в конец списка истории. Любые дубликаты в истории автоматически удаляются. Нажатие клавиш вверх и вниз позволяет просматривать историю вперед и назад. Если текущая командная строка не пуста при запуске поиска в истории, отображаются только команды, содержащие введенную в командную строку строку.
Нажатие Alt-↑ и Alt-↓ также выполняет поиск в истории, но вместо поиска всей командной строки, каждая командная строка разбивается на отдельные элементы, как и до выполнения, и история ищется по элементу, совпадающему с тем, что под курсором.
Поиск в истории можно отменить, нажав клавишу Escape.
Префикс командной строки пробелом предотвратит сохранение всей строки в истории.
История команд по умолчанию сохраняется в файле ~/.local/share/fish/fish_history (или $XDG_DATA_HOME/fish/fish_history, если эта переменная установлена). Однако вы можете установить переменную окружения fish_history для изменения имени сессии истории (что приведет к созданию файла <session>_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)
Если в этих каталогах существует несколько файлов с одинаковым именем, будет выполнен только первый. Они выполняются в порядке их имени файла, отсортированном (как в подстановке шаблонов) в естественном порядке (например, "01" сортируется перед "2").
-
- Инициализация пользователя, обычно в
~/.config/fish/config.fish(управляется переменной средыXDG_CONFIG_HOME).
Эти пути управляются параметрами, заданными при сборке, установке или запуске, и могут отличаться от указанных выше значений по умолчанию.
Этот широкий поиск может быть запутанным. Если вы не уверены, куда поместить свои собственные настройки, воспользуйтесь ~/.config/fish/config.fish.
Обратите внимание, что ~/.config/fish/config.fish подключается после фрагментов. Это позволяет пользователям копировать фрагменты и переопределять некоторые из их функций.
Все эти файлы выполняются при запуске каждой оболочки. Если вы хотите выполнить команду только при запуске интерактивной оболочки, используйте код возврата команды status --is-interactive, чтобы определить, является ли оболочка интерактивной. Если вы хотите выполнить команду только при использовании оболочки входа, используйте status --is-login вместо этого. Это ускорит запуск неинтерактивных или нелогин-оболочек.
Если вы разрабатываете другую программу, вы можете захотеть установить конфигурацию, которая будет выполняться для всех пользователей оболочки fish на системе. Это не рекомендуется; если она не написана тщательно, она может иметь побочные эффекты или замедлить запуск оболочки. Кроме того, пользователи других оболочек не получат выгоды от конфигурации, специфичной для Fish. Однако, если они абсолютно необходимы, вы можете установить их в каталог конфигурации «vendor». Поскольку этот путь может различаться в разных системах, следует использовать фреймворк pkgconfig для определения этого пути с помощью вывода pkg-config --variable confdir fish.
Примеры:
Если вы хотите добавить каталог ~/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-mode.
Настраиваемое приветствие
Если существует функция с именем fish_greeting, она будет запущена при входе в интерактивный режим. В противном случае, если существует переменная среды с именем fish_greeting, она будет напечатана.
Обработчики событий
При определении новой функции в fish её можно сделать обработчиком событий, т. е. функцией, которая автоматически запускается при возникновении определённого события. События, которые могут вызвать обработчик, в настоящее время включают:
- При получении сигнала.
- При выходе процесса или задания.
- При обновлении значения переменной.
- При показе приглашения.
- При ошибке поиска команды.
Пример:
Для задания обработчика сигналов для сигнала WINCH напишите:
function --on-signal WINCH my_signal_handler
echo Got WINCH signal!
end
Обратите внимание, что обработчики событий активируются только при загрузке функции, что означает, что вам, возможно, потребуется в противном случае source или выполнить функцию вместо того, чтобы полагаться на автозагрузку. Один из подходов — поместить её в свой файл инициализации.
Дополнительную информацию о том, как определить новые обработчики событий, см. в документации по команде function.
Отладка скриптов fish
Fish включает встроенный отладочный инструмент. Отладчик позволяет остановить выполнение скрипта в произвольной точке. В этом случае вам будет представлено интерактивное приглашение. На этом приглашении вы можете выполнить любую команду fish (нет специальных команд отладки как таковых). Например, вы можете проверить или изменить значение любой переменной с помощью printf и set. В качестве другого примера, вы можете выполнить status print-stack-trace, чтобы увидеть, как была достигнута эта точка останова. Для возобновления нормального выполнения скрипта просто введите exit или [ctrl-D].
Для запуска сеанса отладки просто выполните встроенную команду breakpoint в том месте функции или скрипта, где вы хотите получить контроль. Кроме того, действие сигнала TRAP по умолчанию — вызов этой встроенной команды. Таким образом, запущенный скрипт можно отладить, отправив ему сигнал TRAP с помощью команды kill. После входа в отладчик легко вставить новые точки останова, используя функцию funced для редактирования определения функции.
Примечание: На данный момент приглашение отладчика идентично вашему обычному приглашению fish. Это может затруднить распознавание того, что вы вошли в сеанс отладки. Вопрос 1310 открыт для улучшения этого.
Общие проблемы с fish
Если вы установили fish в домашнем каталоге, fish не будет работать правильно для любого пользователя, кроме вас. Это происходит потому, что fish нуждается в своих файлах инициализации для правильной работы. Чтобы решить эту проблему, скопируйте файлы инициализации в домашний каталог каждого пользователя fish или установите их в /etc.
Дополнительная помощь и разработка
Если у вас есть вопрос, не имеющий ответа в этой документации, есть несколько способов получить помощь:
- Официальный список рассылки по адресу fish-users@lists.sourceforge.net
- Канал Internet Relay Chat, #fish на
irc.oftc.net - Страница проекта GitHub по адресу
Если у вас есть предложение по улучшению fish, вы можете направить его через список рассылки или страницу GitHub.
© 2005–2009 Axel Liljencrantz
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/2.7/index.html