Spec-Zone.ru › Fish 2.4

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

Введение

Это документация для 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.

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

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

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

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

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

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

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

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

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

Если вы разрабатываете другую программу, вам может потребоваться установить функции, которые доступны всем пользователям оболочки fish в системе. Их можно установить в директорию функций «поставщиков». Поскольку этот путь может отличаться от системы к системе, для обнаружения этого пути с помощью вывода 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

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

Вот общие функции автодополнения, которые предоставляет оболочка:

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

Оболочка предоставляет большое количество специфических автодополнений для программ. Большинство из них — простые варианты, как параметр -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_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-серверы, в known_hosts — ssh-хосты и проверяет файл /etc/hosts.
  • __fish_print_interfaces выводит список всех известных сетевых интерфейсов.
  • __fish_print_packages выводит список всех установленных пакетов. В настоящее время эта функция обрабатывает пакеты Debian, rpm и Gentoo.

Куда помещать завершения

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

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

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

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

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

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

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

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

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

Шаблоны

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

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

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

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

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

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

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

Примеры:

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

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

Примеры:

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

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

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

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

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

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

Примеры:

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

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

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

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

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

Примеры:

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

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

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

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

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

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

Примеры:

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

echo $nonexistentvariable
# Prints no output.

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

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

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

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

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

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

# Output is:
# 10
# 20
# 30

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

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

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

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

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

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

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

Пример:

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

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

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

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

Пример:

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

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

Пример:

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

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

В 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 или в интерактивном режиме.

Не добавляйте значения в переменные общего доступа в 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) после обнаружения управляющего символа, прежде чем прекратить поиск соответствия сочетания клавиш. См. документацию для встроенной команды bind. Эта задержка упрощает использование escape-символа в качестве метасимвола.
  • BROWSER, предпочтительный веб-браузер пользователя. Если эта переменная установлена, fish будет использовать указанный браузер вместо системного браузера для отображения документации fish.
  • CDPATH, массив директорий, в которых нужно искать новый каталог для встроенной команды cd.
  • LANG, LC_ALL, LC_COLLATE, LC_CTYPE, LC_MESSAGES, LC_MONETARY, LC_NUMERIC и LC_TIME устанавливают параметр языка для оболочки и подпрограмм. См. раздел Переменные локали для получения дополнительной информации.
  • fish_user_paths, массив директорий, добавляемых перед PATH. Это может быть переменная общего доступа.
  • PATH, массив директорий, в которых нужно искать команды.
  • umask, текущая маска создания файлов. Предпочтительный способ изменения переменной umask — использование функции umask. Попытка установить umask с недопустимым значением всегда завершится ошибкой.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

set fish_color_error red --bold

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

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

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

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

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

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

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

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

Аналогично bash, fish имеет режимы редактирования Emacs и Vi. Режим редактирования по умолчанию — Emacs. Вы можете переключиться на режим Vi с помощью fish_vi_key_bindings и вернуться обратно с помощью fish_default_key_bindings. Вы также можете создавать собственные сочетания клавиш, создавая функцию и устанавливая $fish_key_bindings в её имя. Например:

function hybrid_bindings --description "Vi-style bindings that inherit emacs-style bindings in all modes"
    for mode in default insert visual
        fish_default_key_bindings -M $mode
    end
    fish_vi_key_bindings --no-erase
end
set -g fish_key_bindings hybrid_bindings

Общие сочетания клавиш

Некоторые сочетания клавиш являются общими для режимов Emacs и Vi, потому что они не являются сочетаниями для редактирования текста или то, что делает Vi/Vim для определённой клавиши, не имеет смысла для оболочки.

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

Команды режима 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 в приглашении. Изначально активен режим вставки insert mode. Escape переходит в command mode. Команды, доступные в режимах команд, вставки и визуального выбора, описаны ниже. Режим Vi разделяет некоторые сочетания клавиш с режимом Emacs.

Также можно добавить все сочетания клавиш режима Emacs в режим Vi, используя что-то вроде

function fish_user_key_bindings
    # Execute this once per mode that emacs bindings should be used in
    fish_default_key_bindings -M insert
    # Without an argument, fish_vi_key_bindings will default to
    # resetting all bindings.
    # The argument specifies the initial mode (insert, "default" or visual).
    fish_vi_key_bindings insert
end

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

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

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

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

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

  • Escape или Control-C переходит в командный режим.
  • Control-x перемещает курсор в конец строки. Если доступно автопредложение, оно будет полностью принято.
  • Backspace удаляет один символ слева.

Визуальный режим

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

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

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

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

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

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

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

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

История хранится в файле ~/.local/share/fish/fish_history (или $XDG_DATA_HOME/fish/fish_history, если эта переменная установлена).

Примеры:

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

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

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

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

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

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

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

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

  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)

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

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

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

Этот обширный поиск может быть запутан. Если вы не уверены, куда поместить свои собственные настройки, используйте ~/.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

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

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

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

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

Чтобы запустить отладчик, просто вызовите встроенную команду 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.4/index.html

Spec-Zone.ru

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