Spec-Zone.ru › Fish 2.6

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

Введение

Это документация для 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 может быть одним из следующих:

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

Пример: Чтобы перенаправить как стандартный вывод, так и стандартную ошибку в файл 'all_output.txt', вы можете написать echo Hello > all_output.txt ^&1.

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

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

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

Объединение команд

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

cat foo.txt | head

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

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

make fish 2>| less

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

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

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

Пример:

emacs &

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

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

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

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

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

Функции

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

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

function ll
    ls -l $argv
end

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Автозагрузка не применима к функциям, созданным с помощью команды 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 для своих команд. Например, man set покажет документацию по set в виде страницы man.

Справка по определённой встроенной команде также может быть получена с параметром -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 печатает список всех известных хостов. Эта функция ищет в fstab nfs-сервера, в ssh — известных хостов и проверяет файл /etc/hosts.
  • /etc/hosts печатает список всех известных сетевых интерфейсов.
  • __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'.

Имена переменных и функций оболочки

Имена, присваиваемые объектам оболочки, таким как переменные и имена функций, называются "идентификаторами". Каждый тип идентификатора имеет правила, которые определяют допустимую последовательность символов, составляющих идентификатор.

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

Имя функции не может быть пустым. Оно не может начинаться с дефиса ("-") и не может содержать слеш ("/"). Все остальные символы, включая пробел, допустимы.

Имя режима привязки (например, bind -m abc ...) ограничено правилами для допустимых имен переменных.

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

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

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

Пример:

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

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

Пример:

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

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

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

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

Например:

function shiver
    set phrase 'Shiver me timbers'
end

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

# Outputs "Avast, mateys"

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

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

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

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

Массивы

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

echo $PATH[3]

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

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

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

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

set smurf blue small

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

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

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

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

# Output 'evil'
echo $smurf

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

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

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

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

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

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

  • Большое количество переменных, начинающихся с префиксов fish_color и fish_pager_color. См. Переменные для изменения цветов выделения для получения дополнительной информации.
  • fish_greeting, сообщение приветствия, выводимое при запуске.
  • fish_escape_delay_ms переопределяет значение таймаута по умолчанию 300 мс (стандартные сочетания клавиш) или 10 мс (сочетания клавиш vi) после отображения символа escape, прежде чем отказаться от сопоставления сочетания клавиш. См. документацию для встроенной команды bind. Это отсрочка позволяет использовать escape как мета-клавишу.
  • BROWSER, предпочитаемый веб-браузер пользователя. Если эта переменная установлена, fish будет использовать указанный браузер вместо системного браузера по умолчанию для отображения документации fish.
  • CDPATH, массив каталогов, в которых нужно искать новый каталог для встроенной команды cd.
  • 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
  • SHLVL, уровень вложенности оболочек
  • COLUMNS и LINES, текущий размер терминала по высоте и ширине. Эти значения используются fish только если операционная система не сообщает размер терминала. В этом случае обе переменные должны быть установлены, в противном случае будет использоваться значение по умолчанию 80x24. Они обновляются при изменении размера окна.

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

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

Переменная status

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

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

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

  • 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
  • fish_color_host, цвет для вывода текущей хостовой системы в некоторых стандартных приглашениях fish
  • 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-↓, также выполняется поиск в истории, но вместо поиска по всей командной строке, каждая командная строка разбивается на отдельные элементы, как и перед выполнением, и история ищется по элементу, соответствующему элементу под курсором.

Поиск в истории можно прервать, нажав клавишу 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.

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

    Если в этих каталогах есть несколько файлов с одинаковым именем, будет выполнен только первый. Они выполняются в порядке их имени файла, отсортированные (как в glob) в естественном порядке (т.е. "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-режима.

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

Распространенные проблемы с fish

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

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

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

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

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

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

Spec-Zone.ru

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