Spec-Zone.ru › Fish 2.2

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

Введение

Это документация для 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_function_path — ~/.config/fish/functions /etc/fish/functions /usr/share/fish/functions. Точный путь к двум последним может немного отличаться в зависимости от пути установки, выбранного при конфигурации. Цель наличия трёх различных директорий заключается в том, что первая — для пользовательских функций, вторая — для дополнительных функций системы, а последняя — для функций fish по умолчанию. Список путей проверяется в порядке, что означает, что по умолчанию системный администратор может переопределить функции fish по умолчанию, а пользователь может переопределить функции, определённые системным администратором.

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

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

Существует четыре встроенные команды 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 — одна из самых экономичных функций любой современной оболочки. Нажав клавишу 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. База данных mimetype используется для поиска подходящего описания.
  • __fish_complete_users выводит список всех пользователей с полным именем в качестве описания.
  • __fish_print_filesystems выводит список всех известных файловых систем. В настоящее время это статический список, не зависящий от того, какие файловые системы фактически понимает хост-операционная система.
  • __fish_print_hostnames выводит список всех известных хост-имен. Эта функция ищет в fstab серверы nfs, ssh для известных хостов и проверяет файл /etc/hosts.
  • __fish_print_interfaces выводит список всех известных сетевых интерфейсов.
  • __fish_print_packages выводит список всех установленных пакетов. Эта функция в настоящее время обрабатывает пакеты Debian, rpm и Gentoo.

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

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

Значение по умолчанию для $fish_complete_path — ~/.config/fish/completions /etc/fish/completions /usr/share/fish/vendor_completions.d /usr/share/fish/completions ~/.local/share/generated_completions. (Некоторые пути могут незначительно отличаться в зависимости от места установки Fish). Если подходящий файл будет найден в одном из этих каталогов, он будет автоматически загружен, и поиск будет остановлен. Большое количество проверяемых каталогов может быть запутанным. Это позволяет, соответственно, пользовательские завершения, системные завершения, завершения, установленные другими пакетами, стандартные завершения, поставляемые с Fish, и, наконец, завершения, сгенерированные из руководств пользователя. Если вы не уверены, поместите свои завершения в ~/.config/fish/completions.

Если вы написали новые завершения для распространённой Unix-команды, пожалуйста, рассмотрите возможность поделиться своей работой, отправив её по инструкциям в разделе Дополнительная помощь и разработка. Если вы разрабатываете другую программу и хотите добавить завершения со своей программой, установите их в каталог /usr/share/fish/vendor_completions.d или аналогичный. Системы, использующие фреймворк pkgconfig, могут обнаружить этот путь из вывода pkg-config --variable completionsdir fish.

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

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

Шаблоны

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

  • ? может соответствовать любому одиночному символу, кроме '/'.
  • * может соответствовать любой строке символов, не содержащей '/'. Это включает соответствие пустой строке.
  • ** соответствует любой строке символов. Это включает соответствие пустой строке. Строка может включать символ /, но не обязательно.

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

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

Примеры:

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

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

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

Вывод последовательности команд может быть использован как параметры для другой команды. Если параметр содержит набор скобок, текст, заключённый в скобки, будет интерпретирован как список команд. При расширении этот список выполняется и заменяется выводом. Если вывод занимает более одной строки, каждая строка будет расширена в новый параметр. Установка 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.

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

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

Расширение переменных — единственный тип расширения, выполняемый над строками в двойных кавычках. Однако существует важное различие в том, как переменные расширяются в кавычках и без них. Расширение неопределённой переменной без кавычек приведёт к нулевому количеству аргументов. Например, если переменная $foo имеет ноль элементов или не определена, аргумент $foo будет расширен до нуля элементов. Если переменная $foo является массивом из пяти элементов, аргумент $foo будет расширен до пяти элементов. В кавычках, как "$foo", расширение переменной всегда будет приводить к ровно одному аргументу. Неопределённые переменные будут расширяться до пустой строки, а массивы переменных будут конкатенироваться с использованием пробела. Таким образом, опасности, отмеченные в третьем примере выше, можно избежать, заключив переменную в двойные кавычки (echo {"$WORD"}s).

Существует ещё одна важная особенность расширения переменных 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].

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

И подстановка команд, и расширение переменных оболочки поддерживают доступ только к определённым элементам путём предоставления набора индексов в квадратных скобках. Часто требуется получить последовательность элементов. Для этого используйте оператор диапазона '..' для этого. Диапазон '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 оболочки.
  • В противном случае, если строка является идентификатором задания, результатом является идентификатор группы процессов задания.
  • В противном случае, если какие-либо дочерние процессы соответствуют указанной строке, их 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 или с помощью интерактивного режима 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 путём изменения значений определённых переменных среды.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Пример:

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

set fish_color_error red --bold

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Режим команд

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

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

Режим ввода

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

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

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

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

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

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

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

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

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

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

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

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

Примеры:

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

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

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

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

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

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

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

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

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

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

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

При запуске fish оценивает файлы /usr/share/fish/config.fish (или /usr/local/fish..., если вы установили fish в /usr/local) и /etc/fish/config.fish (или ~/etc/fish/..., если вы установили fish в домашний каталог) и ~/.config/fish/config.fish (или любой другой каталог, указанный переменной $XDG_CONFIG_HOME), в указанном порядке.

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

Примеры:

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

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

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

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

Другие возможности

Подсветка синтаксиса

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

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

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

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

Для настройки подсветки синтаксиса вы можете установить переменные среды fish_color_normal, fish_color_command, fish_color_substitution, fish_color_redirection, fish_color_end, fish_color_error, fish_color_param, fish_color_comment, fish_color_match, fish_color_search_match, fish_color_cwd, fish_pager_color_prefix, fish_pager_color_completion, fish_pager_color_description, fish_pager_color_progress и fish_pager_color_secondary. Обычно значение этих переменных будет одним из black, red, green, brown, yellow, blue, magenta, purple, cyan, white или normal, но они могут быть массивом, содержащим любые варианты цветов для команды set_color.

set fish_color_error black --background=red --bold
# Make all commandline errors be written in a black,
# bold font, with a red background.

Настраиваемое название

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

Примеры: По умолчанию заголовок fish такой

function fish_title
    echo $_ ' '
    pwd
end

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

function fish_title
    echo $argv[1]
end

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

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

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

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

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

Пример:

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

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

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

Отладка сценариев fish

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

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

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

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

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

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

  1. Официальный список рассылки по адресу fish-users@lists.sf.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.2/index.html

Spec-Zone.ru

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