Введение
Это документация для fish, фриендли интерактивного шелла.
Шелл — это программа, которая помогает вам управлять компьютером, запуская другие программы. fish предлагает командную строку, ориентированную на удобство и интерактивное использование.
В отличие от других шеллов, fish не следует стандарту POSIX, но всё же примерно относится к той же группе.
Некоторые из особых функций fish:
- Расширенный пользовательский интерфейс: подсветка синтаксиса, автодополнение, завершение по табу и списки выбора, которые можно просматривать и фильтровать.
- Нет необходимости в настройке: fish разработан для того, чтобы быть готовым к использованию сразу же без сложной настройки.
- Легкое программирование: новые функции могут быть добавлены на лету. Синтаксис прост в освоении и использовании.
Эта часть документации — краткое руководство по началу работы. Если вы новичок, см. учебник.
Установка и запуск
В этом разделе рассказывается, как установить, удалить, запустить и выйти из оболочки fish, а также о том, как сделать fish стандартной оболочкой:
- Установка: Как установить fish
- Запуск и выход: Как запустить и выйти из оболочки fish
- Выполнение Bash: Как выполнить команды bash в fish
- Стандартная оболочка: Как переключиться на fish в качестве стандартной оболочки
- Удаление: Как удалить fish
Установка
Актуальные инструкции по установке последней версии fish находятся на главной странице fish.
Чтобы установить тестовую версию fish, см. инструкции на странице проекта GitHub.
Запуск и выход
После установки fish откройте терминал. Если fish не является стандартной оболочкой:
-
Введите
fishдля запуска оболочки fish:> fish
-
Введите
exitдля выхода из оболочки fish:> exit
Выполнение Bash
Если fish является вашей стандартной оболочкой, и вы хотите скопировать команды из интернета, написанные на другом языке оболочки, например bash, вы можете поступить следующим образом:
Предположим, что bash тоже является командой. С помощью man bash вы можете увидеть, что есть два способа сделать это:
-
bashимеет переключатель-cдля чтения из строки:> bash -c SomeBashCommand
или bash без переключателя открывает оболочку bash, которой вы можете воспользоваться, и exit после этого.
Стандартная оболочка
Вы можете сделать fish стандартной оболочкой, добавив исполняемый файл fish в два места: - добавьте /usr/local/bin/fish в /etc/shells - измените стандартную оболочку с chsh -s на /usr/local/bin/fish.
Для подробных инструкций см. переключение на fish.
Удаление
Для удаления fish: см. FAQ: Удаление fish.
Строка shebang
Поскольку скрипты для команд оболочки могут быть написаны на многих разных языках, они должны содержать информацию о том, какой интерпретатор нужен для их выполнения: для этого они должны иметь первую строку, строку shebang, которая называет исполняемый файл для этой цели:
Пример:
Скрипт, написанный на bash языке, потребует первой строки такого вида:
#!/bin/bash
Эта строка сообщает оболочке выполнить файл с помощью интерпретатора bash, который находится по пути /bin/bash.
Для скрипта, написанного на другом языке, просто замените интерпретатор /bin/bash на интерпретатор языка этого другого языка (например, /bin/python для скрипта python).
Эта строка необходима только при выполнении скриптов без указания интерпретатора. Для функций внутри fish или при выполнении скрипта с `fish /path/to/script они не требуются (но не помешают!).
Обзор синтаксиса
Оболочки, такие как 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, вывести содержимое файлов
Команды и параметры разделяются пробелом ' '. Каждая команда завершается либо новой строкой (то есть нажатием клавиши Enter), либо точкой с запятой ';'. На одной строке можно написать несколько команд, разделив их точкой с запятой.
Переключатель — это очень распространённый специальный тип аргумента. Переключатели почти всегда начинаются с одного или нескольких тире '-' и изменяют способ работы команды. Например, команда 'ls' обычно выводит список всех файлов и каталогов в текущем рабочем каталоге, но с помощью переключателя '-l' поведение 'ls' изменяется так, чтобы отображались не только имена файлов, но также размер, права, владелец и время изменения каждого файла.
Переключатели различаются в зависимости от команд и документированы в справке по каждой команде. Однако некоторые переключатели являются общими для большинства команд, например, '--help' обычно выводит текст справки, '-i' часто включает интерактивное приглашение перед выполнением действия, а '-f' — отключает его.
Некоторые распространённые слова
Это краткое объяснение некоторых часто используемых слов в fish.
- аргумент параметр, переданный команде
- встроенная команда команда, реализованная в оболочке. Встроенные команды — это команды, которые настолько тесно связаны с оболочкой, что их невозможно реализовать как внешние команды.
- команда программа, которую может запустить оболочка. В другом смысле также конкретно внешняя команда (то есть не функция и не встроенная команда).
- функция блок команд, который можно вызвать так, как если бы это была одна команда. С помощью функций можно объединить несколько меньших команд в одну более сложную команду.
- задача запущенная команда или конвейер
- конвейер набор команд, объединённых так, что вывод одной команды является вводом следующей команды
- перенаправление операция, которая изменяет один из потоков ввода/вывода, связанных с задачей
- переключатель специальный флаг, отправленный в качестве аргумента команде, который изменит поведение команды. Переключатель почти всегда начинается с одного или двух тире.
Кавычки
Иногда такие функции, как расширение параметров и экранирование символов мешают. В таких случаях пользователь может написать параметр в кавычках, либо ' (одинарные кавычки), либо " (двойные кавычки). Существует важное различие между строками в одинарных и двойных кавычках: при использовании строки в двойных кавычках всё ещё происходит расширение переменных. Кроме этого, никакое другое расширение (включая расширение фигурных скобок и расширение параметров) не произойдёт, параметр может содержать пробелы, а последовательности экранирования игнорируются.
Единственные обратные слэши, принимаемые в одинарных кавычках, это \', который экранирует одинарную кавычку, и \\, который экранирует обратный слэш. Единственные обратные слэши, принимаемые в двойных кавычках, это \", который экранирует двойную кавычку, \$, который экранирует символ доллара, \ с последующей новой строкой, которые удаляют обратный слэш и новую строку, и, наконец, \\, который экранирует обратный слэш. Одинарные кавычки не имеют особого значения в двойных кавычках и наоборот.
Пример:
rm "cumbersome filename.txt"
Удалит файл 'cumbersome filename.txt', в то время как
rm cumbersome filename.txt
удалит два файла 'cumbersome' и 'filename.txt'.
Экранирование символов
Некоторые символы не могут быть написаны непосредственно в командной строке. Для этих символов предоставляются так называемые последовательности экранирования. Это:
-
\aпредставляет символ предупреждения -
\bпредставляет символ возврата к началу строки -
\eпредставляет символ escape -
\fпредставляет символ перевода страницы -
\nпредставляет символ новой строки -
\rпредставляет символ возврата каретки -
\tпредставляет символ табуляции -
\vпредставляет символ вертикальной табуляции -
\эскэпирует символ пробела -
\$эскэпирует символ доллара -
\\эскэпирует символ обратного слэша -
\*эскэпирует символ звёздочки -
\?эскэпирует символ вопроса (это необязательно, еслиqmark-noglobфлаг функции включён) -
\~эскэпирует символ тильды -
\#эскэпирует символ решётки -
\(эскэпирует символ левой круглой скобки -
\)эскэпирует символ правой круглой скобки -
\{эскэпирует символ левой фигурной скобки -
\}эскэпирует символ правой фигурной скобки -
\[эскэпирует символ левой квадратной скобки -
\]эскэпирует символ правой квадратной скобки -
\\<эскэпирует символ "меньше чем" -
\\>эскэпирует символ "больше чем" -
\^эскэпирует символ круглой черты -
\&эскэпирует символ амперсанда -
\|эскэпирует символ вертикальной черты -
\;эскэпирует символ точки с запятой -
\"эскэпирует символ кавычки -
\'эскэпирует символ апострофа -
\xHH, где HH - шестнадцатеричное число, представляет собой символ ASCII с указанным значением. Например,\x9- это символ табуляции. -
\XHH, где HH - шестнадцатеричное число, представляет собой байт данных с указанным значением. Если вы используете многобайтовую кодировку, это можно использовать для ввода недопустимых строк. Используйте это только в том случае, если вы знаете, что делаете. -
\ooo, где ooo - восьмеричное число, представляет собой символ ASCII с указанным значением. Например,\011- это символ табуляции. -
\uXXXX, где XXXX - шестнадцатеричное число, представляет собой 16-битный символ Unicode с указанным значением. Например,\u9- это символ табуляции. -
\UXXXXXXXX, где XXXXXXXX - шестнадцатеричное число, представляет собой 32-битный символ Unicode с указанным значением. Например,\U9- это символ табуляции. -
\cX, где X - буква алфавита, представляет собой управляющую последовательность, генерируемую при нажатии клавиши управления и указанной буквы. Например,\ci- это символ табуляции
Перенаправление ввода/вывода
Большинство программ используют три потока ввода/вывода [1], каждый из которых представлен числом, называемым дескриптором файла (FD). Это:
- Стандартный ввод, FD 0, для чтения, по умолчанию считывает из клавиатуры.
- Стандартный вывод, FD 1, для записи, по умолчанию записывает на экран.
- Стандартная ошибка, FD 2, для записи ошибок и предупреждений, по умолчанию записывает на экран.
Любой дескриптор файла может быть перенаправлен на другой вывод, чем по умолчанию, через механизм, называемый перенаправлением.
Пример перенаправления файла echo hello > output.txt, который перенаправляет вывод команды echo в файл output.txt.
- Для чтения стандартного ввода из файла, напишите
<SOURCE_FILE - Для записи стандартного вывода в файл, напишите
>DESTINATION - Для записи стандартной ошибки в файл, напишите
2>DESTINATION[2] - Для добавления стандартного вывода в файл, напишите
>>DESTINATION_FILE - Для добавления стандартной ошибки в файл, напишите
2>>DESTINATION_FILE - Для того, чтобы не перезаписывать существующий файл, напишите
>?DESTINATIONили2>?DESTINATION(это также известно как перенаправление "noclobber")
DESTINATION может быть одним из следующих:
- Имя файла. Вывод будет записан в указанный файл.
- Амперсанд (
&) за которым следует число другого дескриптора файла. Вывод будет записан в этот дескриптор файла вместо этого. - Амперсанд, за которым следует знак минус (
&-). Дескриптор файла будет закрыт.
Для удобства перенаправление &> можно использовать для перенаправления stdout и stderr в один и тот же файл.
Пример:
Для перенаправления стандартного вывода и стандартной ошибки в файл 'all_output.txt', вы можете написать echo Hello &> all_output.txt, что является удобством для echo Hello > all_output.txt 2>&1.
Любой дескриптор файла может быть перенаправлен произвольным способом путём добавления префикса дескриптора файла к перенаправлению.
- Для перенаправления ввода FD N, напишите
N<DESTINATION - Для перенаправления вывода FD N, напишите
N>DESTINATION - Для добавления вывода FD N в файл, напишите
N>>DESTINATION_FILE
Пример: echo Hello 2>output.stderr записывает стандартную ошибку (дескриптор файла 2) целевой программы в output.stderr.
| [1] | Также сокращенно как "I/O". |
| [2] | Предыдущие версии fish также позволяли писать это как ^DESTINATION, но это делало другой символ специальным, поэтому он был устаревшим и будет удален в будущих версиях. |
Перенаправление
Пользователь может объединить несколько команд в перенаправление. Это означает, что стандартный вывод одной команды будет считан как стандартный ввод следующей команды. Это делается путём разделения команд символом трубы '|'. Например
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.
Для удобства труба &| может использоваться для перенаправления stdout и stderr в один и тот же процесс. (Обратите внимание, что это отличается от bash, который использует |&).
Фоновые задачи
Когда вы запускаете задачу в fish, fish приостановится и передаст управление терминалом только что запущенной программе. Иногда вам нужно продолжить использование командной строки и запустить задачу в фоновом режиме. Чтобы создать фоновую задачу, добавьте & (амперсанд) к вашей команде. Это укажет fish на запуск задачи в фоновом режиме. Фоновые задачи очень полезны при работе с программами, имеющими графический интерфейс пользователя.
Пример:
emacs &
запустит текстовый редактор emacs в фоновом режиме.
Управление задачами
Большинство программ позволяют приостановить выполнение программы и вернуть управление fish нажатием клавиш Control+Z (также известное как ^Z). После возврата в fish командную строку, вы можете запускать другие программы и делать всё, что хотите. Если вы хотите вернуться к приостановленной команде, используйте команду fg (в фоновый режим).
Если вы хотите поместить приостановленную задачу в фоновый режим, используйте команду bg.
Чтобы получить список всех запущенных задач, используйте команду jobs. Эти задачи могут быть удалены с помощью команды disown.
Функции
Функции – это программы, написанные на языке синтаксиса 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, что функция не должна вызывать себя, а команду с тем же именем. Если вы забудете это сделать, функция будет вызывать себя до бесконечности. Обычно fish достаточно умен, чтобы разобраться с этим и воздержится от этого (что, надеемся, вам на руку). - Автозагрузка не применима к псевдонимам. По определению, функция создается в момент выполнения команды alias. Вы не можете загружать псевдонимы автоматически.
Для простого создания функции такого типа можно использовать команду alias.
Автозагрузка функций
Функции могут быть определены в командной строке или в файле конфигурации, но также могут загружаться автоматически. Это имеет некоторые преимущества:
- Автозагружаемая функция становится доступной автоматически для всех запущенных оболочек.
- Если определение функции изменено, все запущенные оболочки автоматически перезагрузят изменённую версию.
- Время запуска и использование памяти улучшаются и т. д.
Когда fish необходимо загрузить функцию, она ищет в списке переменных $fish_function_path файлы с именем, состоящим из имени функции плюс суффикс '.fish', и загружает первый найденный.
По умолчанию $fish_function_path содержит следующее:
- Директория для хранения собственных функций конечных пользователей, обычно
~/.config/fish/functions(управляется переменной средыXDG_CONFIG_HOME). - Директория для системных администраторов, чтобы устанавливать функции для всех пользователей системы, обычно
/etc/fish/functions(на самом деле$__fish_sysconfdir/functions). - Директории для поставщиков стороннего программного обеспечения, чтобы поставлять свои собственные функции для своего программного обеспечения. Fish ищет директории в переменной среды
XDG_DATA_DIRSдля директорииfish/vendor_functions.d; если эта переменная не определена, по умолчанию ищется/usr/share/fish/vendor_functions.dи/usr/local/share/fish/vendor_functions.d. - Функции, поставляемые с fish, обычно установленные в
/usr/share/fish/functions(на самом деле$__fish_data_dir/functions).
Эти пути управляются параметрами, установленными во время сборки, установки или выполнения, и могут отличаться от указанных по умолчанию.
Этот широкий поиск может быть запутанным. Если вы не уверены, ваши функции, вероятно, должны быть в ~/.config/fish/functions.
Очень важно, чтобы файлы определения функций содержали только определение указанной функции и ничего больше. В противном случае возможно, что для автозагрузки файла функции требуется, чтобы функция уже была загружена, что создаёт циклическую зависимость.
Автозагрузка также не работает для обработчиков событий, так как fish не может знать, что функция должна быть выполнена, когда произойдёт событие, если она ещё не загружена. Для получения дополнительной информации см. раздел обработчики событий.
Автозагрузка не применима к функциям, созданным командой alias. Для достаточно простых функций, для определения которых вы предпочитаете использовать команду alias, вам нужно поместить эти команды в ваш скрипт ~/.config/fish/config.fish или какой-либо другой скрипт, запускаемый при запуске оболочки.
Если вы разрабатываете другую программу, вы можете установить функции, которые доступны всем пользователям оболочки fish в системе. Их можно установить в директорию функций "vendor". Поскольку этот путь может отличаться от системы к системе, для определения этого пути следует использовать фреймворк pkgconfig с выводом pkg-config --variable functionsdir fish. Ваша система установки должна поддерживать пользовательский путь для переопределения пути pkgconfig, поскольку другим дистрибутивам может потребоваться легко его изменить.
Условное выполнение кода и управление потоком
Существует четыре встроенные команды fish, которые позволяют выполнить команды только в том случае, если выполняется определённое условие. Эти встроенные команды: if, switch, and и or.
Команда switch используется для выполнения одной из, возможно, многих групп команд, в зависимости от значения строки. Дополнительную информацию см. в документации по switch.
Другие условные операторы используют код завершения команды для определения того, должна ли быть выполнена команда или группа команд. Дополнительную информацию см. в их документации.
Расширение параметров (Глоббинг)
Когда аргумент программы задаётся в командной строке, он проходит процесс расширения параметров перед отправкой команде. Расширение параметров — мощный механизм, который позволяет расширить параметр различными способами, включая выполнение сопоставления по шаблонам с файлами, вставку значения переменной оболочки в параметр или даже использование вывода другой команды в качестве списка параметров.
Шаблоны
Если в параметре присутствует звездочка (*) или знак вопроса (?), fish пытается сопоставить данный параметр с любыми файлами таким образом, что:
-
*может соответствовать любой строке символов, не содержащей '/'. Это включает соответствие пустой строке. -
**соответствует любой строке символов. Это включает соответствие пустой строке. Сопоставленная строка может включать символ/; то есть, она рекурсивно входит в подкаталоги. Обратите внимание, что расширение этого шаблона другими строками не будет сопоставлять файлы в текущем рабочем каталоге ($PWD), если вы разделите строки с помощью косой черты ("/"). Это отличается от других оболочек, таких как zsh. Например,**\/*.fishв zsh будет сопоставлять файлы.fishв текущем каталоге, но в fish будет сопоставлять только такие файлы в подкаталоге. В fish вам следует ввести**.fishдля сопоставления файлов в текущем каталоге и всех подкаталогов. -
?может соответствовать любому одиночному символу, кроме '/'. Это устаревшее свойство и может быть отключено с помощьюqmark-noglobфлага функции, поэтому?будет просто обычным символом.
Другие оболочки, такие как 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. Существует ровно 4 исключения, а именно 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 в пустую строку отключит разделение строк.
Если вывод перенаправляется на string split или string split0 как последняя операция, эти разделения используются как они есть, и дополнительное разделение по переводу строки не выполняется.
Код завершения последней исполненной подстановки команд доступен в переменной status, если подстановка происходит в контексте команды set.
Можно использовать только часть вывода, см. расширение диапазона индексов для подробностей.
Fish имеет по умолчанию ограничение в 100 МБ на объём данных, которые может вывести подстановка команды. Если предел превышен, вся команда, а не только подстановка, завершается неудачно, и $status устанавливается в 122. Вы можете изменить ограничение, установив переменную fish_read_limit в любое время, включая переменную среды перед запуском fish. Если вы установите её в ноль, ограничение не будет применено. Это мера безопасности, чтобы предотвратить потребление оболочкой слишком много памяти, если команда выведет неразумное количество данных, обычно ваша операционная система также имеет ограничение, и оно часто намного ниже. Обратите внимание, что это ограничение также влияет на то, сколько данных будет обработать команда read.
Примеры:
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 a list. set data (cat data | string split0) # Set ``$data`` to the contents of data, splitting on NUL-bytes.
Расширение фигурных скобок
Список символов, разделённых запятыми и заключённых в фигурные скобки, будет расширен таким образом, что каждый элемент списка станет новым параметром. Это полезно для экономии набора текста и для разделения имени переменной от окружающего текста.
Примеры:
> echo input.{c,h,txt}
input.c input.h input.txt
> mv *.{c,h} src/
# Moves all files with the suffix '.c' or '.h' to the subdirectory src.
> cp file{,.bak}
# Make a copy of `file` at `file.bak`.
> set -l dogs hot cool cute
> echo {$dogs}dog
hotdog cooldog cutedog
Если две фигурные скобки не содержат "," или расширение переменной, они не будут расширены таким образом:
> echo foo-{}
foo-{}
> git reset --hard HEAD@{2}
# passes "HEAD@{2}" to git
> echo {{a,b}}
{a} {b} # because the inner brace pair is expanded, but the outer isn't.
Если после расширения между фигурными скобками ничего нет, аргумент будет удален (см. раздел декартово произведение):
> echo foo-{$undefinedvar}
# Output is an empty line, just like a bare `echo`.
Если между фигурной скобкой и запятой или двумя запятыми ничего нет, это интерпретируется как пустой элемент:
> echo {,,/usr}/bin
/bin /bin /usr/bin
Чтобы использовать "," в качестве элемента, скопировать или экранировать его.
Расширение переменных
Знак доллара, за которым следует строка символов, расширяется до значения переменной оболочки с тем же именем. Дополнительную информацию о переменных оболочки см. в разделе Переменные оболочки.
Примеры:
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} работает за счёт использования расширения фигурных скобок.
В этих случаях расширение удаляет строку в результате неявного декартова произведения.
Если в приведённом выше примере переменная $WORD не определена или является пустым списком, символ "s" не выводится. Однако он выводится, если $WORD — это пустая строка (например, после set WORD "").
В отличие от всех других расширений, расширение переменной также происходит в строках с двойными кавычками. Внутри двойных кавычек ("these") переменные всегда расширяются ровно до одного аргумента. Если они пустые или неопределённые, результатом будет пустая строка. Если они содержат один элемент, они расширятся до этого элемента. Если их больше, элементы будут объединены пробелами [3].
За пределами двойных кавычек переменные будут расширяться до количества аргументов, соответствующему количеству элементов. Это означает, что пустой список расширяется до пустого значения, переменная с одним элементом расширяется до этого элемента, а переменная с несколькими элементами расширяется до каждого из этих элементов отдельно.
Когда два нескопированных расширения непосредственно следуют друг за другом, необходимо следить за расширениями, которые расширяются до пустого значения. К ним относятся неопределённые переменные и пустые списки, а также подстановки команд без вывода. Дополнительную информацию см. в разделе декартово произведение.
Символ $ также может использоваться несколько раз, как оператор «разыменования» (аналог * в C или C++), как показано в следующем коде:
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].
| [3] | В отличие от bash или zsh, которые будут объединяться с первым символом $IFS (который обычно является пробелом). |
Декартово произведение
Списки, расположенные рядом с другими списками или строками, расширяются как декартовы произведения:
Примеры:
>_ 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 {$c}word
# Output is an empty line
Будьте осторожны, когда пытаетесь использовать фигурные скобки для разделения имён переменных и текста. Проблему, показанную выше, можно избежать, поместив переменную в двойные кавычки вместо фигурных скобок (echo "$c"word).
Это также происходит после подстановки команд. Поэтому строки могут быть удалены. Этого можно избежать, заставив внутреннюю команду возвращать конечный символ новой строки.
Например:
>_ echo (printf '%s' '')banana # the printf prints literally nothing >_ echo (printf '%s\n' '')banana # the printf prints just a newline, so the command substitution expands to an empty string banana # After command substitution, the previous line looks like: >_ echo ""banana
Примеры:
>_ set b 1 2 3 >_ echo (echo x)$b x1 x2 x3
Расширение диапазона индексов
Иногда необходимо получить доступ только к некоторым элементам списка или строкам, выводимым командой подстановки. Оба позволяют это, предоставляя набор индексов в квадратных скобках.
Последовательности элементов могут быть записаны с оператором диапазона '..'. Диапазон 'a..b' ('a' и 'b' — целые числа) расширяется до последовательности индексов 'a a+1 a+2 ... b' или 'a a-1 a-2 ... b', в зависимости от того, какой из 'a' или 'b' больше. Отрицательные пределы диапазона рассчитываются с конца списка. Если индекс слишком большой или слишком маленький, он молча приводится к одному или к размеру списка, соответственно.
Если конец меньше начала, или начало больше конца, расширение диапазона произойдёт в обратном порядке. Это не произойдёт, если ровно один из заданных индексов отрицательный, поэтому направление не меняется, если в списке меньше элементов, чем ожидалось.
Примеры:
echo (seq 10)[1 2 3] # Prints: 1 2 3 # 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 # The command substitution has only one line, # so these will result in empty output: echo (echo one)[2..-1] echo (echo one)[-3..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]
Переменные могут использоваться как индексы для расширения переменных, например:
set index 2 set letters a b c d echo $letters[$index] # returns 'b'
Однако использование переменных в качестве индексов для подстановки команд в настоящее время не поддерживается, поэтому:
echo (seq 5)[$index] # This won't work set sequence (seq 5) # It needs to be written on two lines like this. echo $sequence[$index] # returns '2'
При использовании косвенного расширения переменных с несколькими $ ($$name), необходимо указать все индексы до переменной, которую вы хотите нарезать:
> set -l list 1 2 3 4 5 > set -l name list > echo $$name[1] 1 2 3 4 5 > echo $$name[1..-1][1..3] # or $$name[1][1..3], since $name only has one element. 1 2 3
Расширение домашнего каталога
Символ ~ (тильда) в начале параметра, за которым следует имя пользователя, расширяется до домашнего каталога указанного пользователя. Одиночная ~, или ~ за которой следует слеш, расширяется до домашнего каталога владельца процесса.
Комбинирование различных расширений
Все вышеперечисленные расширения можно комбинировать. Если несколько расширений приводят к более чем одному параметру, создаются все возможные комбинации.
При комбинировании нескольких расширений параметров расширения выполняются в следующем порядке:
- Подстановки команд
- Расширения переменных
- Расширение фигурных скобок
- Расширение шаблонов
Расширения выполняются справа налево, вложенные расширения фигурных скобок выполняются изнутри наружу.
Пример:
Если в текущем каталоге находятся файлы «foo» и «bar», команда echo a(ls){1,2,3} выведет abar1 abar2 abar3 afoo1 afoo2 afoo3.
Имена переменных и функций оболочки
Имена, присваиваемые объектам оболочки, таким как переменные и имена функций, называются «идентификаторами». Каждый тип идентификатора имеет правила, определяющие, какие последовательности символов можно использовать.
Имя переменной не может быть пустым. Оно может содержать только буквы, цифры и символы подчёркивания. Оно может начинаться и заканчиваться любым из этих символов.
Имя функции не может быть пустым. Оно не может начинаться с дефиса ("-") и не может содержать слэша ("/"). Все остальные символы, включая пробел, допустимы.
Имя режима привязки (например, bind -m abc ...) ограничено правилами для допустимых имён переменных.
Переменные оболочки
Переменные оболочки — это именованные данные, которые пользователь может создавать, удалять, изменять и использовать. Переменные могут быть «экспортированы», так что копия переменной доступна любым дочерним процессам, созданным оболочкой. Экспортированная переменная называется «переменной среды».
Для установки значения переменной используйте команду set. Имя переменной не может быть пустым и может содержать только буквы, цифры и символы подчёркивания. Оно может начинаться и заканчиваться любым из этих символов.
Пример:
Чтобы установить переменную smurf_color со значением blue, используйте команду set smurf_color blue.
После установки переменной вы можете использовать её значение в оболочке с помощью расширения переменных.
Пример:
Чтобы использовать значение переменной smurf_color, напишите $ (символ доллара) за которым следует имя переменной, например echo Smurfs are usually $smurf_color, что выведет результат 'Гномы обычно голубые'.
Область видимости переменных
В Fish есть три типа переменных: универсальные, глобальные и локальные.
- Универсальные переменные доступны во всех сеансах Fish, которые пользователь запускает на одном компьютере.
- Глобальные переменные специфичны для текущего сеанса Fish, но не связаны ни с какой областью видимости блока и никогда не будут удалены, если пользователь явно не попросит об этом, используя
set -e. - Локальные переменные специфичны для текущего сеанса Fish и связаны с конкретным блоком команд, и автоматически удаляются при выходе из области видимости конкретного блока. Блок команд — это последовательность команд, которая начинается с одной из команд
for,while,if,function,beginилиswitch, и заканчивается командойend.
Переменные можно явно установить в универсальный, глобальный или локальный диапазон с помощью переключателя -U или --universal, глобальный с помощью переключателя -g или --global, или локальный с помощью переключателя -l или --local. Правила области видимости при создании или обновлении переменной:
- Если переменная явно установлена в область видимости (универсальная, глобальная или локальная), это значение будет сохранено. Если переменная с тем же именем существует в другой области видимости, эта переменная не будет изменена.
- Если переменная не явно установлена в область видимости, но ранее была определена, область видимости переменной не изменяется.
- Если переменная не явно установлена в область видимости и не была определена, переменная будет локальной для текущей выполняемой функции. Обратите внимание, что это отличается от использования флага
-lили--local. Если один из этих флагов используется, переменная будет локальной для самого внутреннего блока, в то время как без них переменная будет локальной для функции. Если ни одна функция не выполняется, переменная будет глобальной.
Может быть много переменных с одинаковым именем, но разной областью видимости. При использовании переменной область видимости переменной будет проверяться изнутри наружу, т. е. локальная переменная будет использоваться вместо глобальной переменной с тем же именем, глобальная переменная будет использоваться вместо универсальной переменной с тем же именем.
Пример:
Следующий код ничего не выведет:
begin
# This is a nice local scope where all variables will die
set -l pirate 'There be treasure in them thar hills'
end
echo $pirate
# This will not output anything, since the pirate was local
Переопределение переменных для одной команды
Если вы хотите переопределить переменную для одной команды, вы можете использовать операторы «переменная=значение» перед командой:
# Call git status on another directory (can also be done via `git -C somerepo status`) GIT_DIR=somerepo git status
Обратите внимание, что, в отличие от других оболочек, Fish сначала устанавливает переменную, а затем выполняет другие расширения в строке, поэтому:
set foo banana foo=gagaga echo $foo # prints gagaga, while in other shells it might print "banana"
Несколько элементов могут быть заданы в расширении фигурных скобок:
# Call bash with a reasonable default path.
PATH={/usr,}/{s,}bin bash
Этот синтаксис поддерживается начиная с fish 3.1.
Подробнее о универсальных переменных
Универсальные переменные — это переменные, которые используются всеми сессиями fish на компьютере. Fish хранит многие свои параметры конфигурации в виде универсальных переменных. Это означает, что для изменения настроек fish вам нужно изменить значение переменной один раз, и оно будет автоматически обновлено для всех сессий и сохранится при перезагрузке компьютера и входа/выхода из системы.
Чтобы увидеть универсальные переменные в действии, запустите две сессии fish рядом и выполните следующую команду в одной из них set fish_color_cwd blue. Поскольку fish_color_cwd — это универсальная переменная, цвет отображения текущей рабочей директории в командной строке мгновенно изменится на синий в обоих терминалах.
Универсальные переменные хранятся в файле .config/fish/fish_variables. Не редактируйте этот файл напрямую, так как ваши правки могут быть перезаписаны. Редактируйте переменные с помощью скриптов fish или в интерактивном режиме.
Не добавляйте к универсальным переменным в config.fish, так как эти переменные будут удлиняться с каждой новой оболочкой. Вместо этого просто установите их один раз в командной строке.
Область видимости переменных для функций
При вызове функции все текущие локальные переменные временно исчезают. Эта маскировка локальной области видимости необходима, так как пространство имен переменных может стать перегруженным, что сильно затрудняет случайное перезаписывание переменных из другой функции.
Например:
function shiver
set phrase 'Shiver me timbers'
end
function avast
set --local 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. В частности, это необходимо для переменных, используемых для настройки внешних команд, таких как $LESS или $GOPATH, а также для переменных, содержащих общие системные настройки, такие как $PATH или $LANGUAGE. Если внешней команде нужна переменная, она должна быть экспортирована.
Переменные могут быть явно установлены как экспортируемые с помощью -x или --export флага, или не экспортируемые с помощью -u или --unexport флага. Правила экспорта при установке переменной идентичны правилам области видимости переменных:
- Если переменная явно установлена как экспортируемая или неэкспортируемая, это свойство будет соблюдено.
- Если переменная явно не установлена как экспортируемая или неэкспортируемая, но была определена ранее, предыдущее правило экспорта переменной сохраняется.
- В противном случае, по умолчанию, переменная не будет экспортирована.
- Если переменная имеет локальную область видимости и экспортирована, любая вызываемая функция получает _копию_ ее, поэтому любые изменения, которые она вносит в переменную, исчезают после возвращения из функции.
- Глобальные переменные доступны функциям, независимо от того, экспортированы они или нет.
В качестве соглашения об именовании, экспортируемые переменные написаны заглавными буквами, а неэкспортируемые — строчными.
Списки
fish может хранить список (или «массив», если хотите) нескольких строк внутри переменной. Чтобы получить доступ к одному элементу списка, используйте индекс элемента в квадратных скобках, как показано ниже:
echo $PATH[3]
Обратите внимание, что индексы списков начинаются с 1 в fish, а не с 0, как чаще используется в других языках. Это связано с тем, что многие распространенные утилиты Unix, такие как seq, лучше подходят для такого использования. Некорректный индекс будет проигнорирован, не вызывая подстановки значения (не пустой строки).
Если вы не используете квадратные скобки, все элементы списка будут выведены как отдельные элементы. Это означает, что вы можете легко перебирать список, используя этот синтаксис:
for i in $PATH; echo $i is in the path; end
Чтобы создать переменную smurf, содержащую элементы blue и small, просто напишите:
set smurf blue small
Также возможно установить или удалить отдельные элементы списка:
# Set smurf to be a list 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 означает последний индекс списка.
Можно указать диапазон индексов, см. расширение диапазона индексов для получения подробностей.
Все списки одномерные и не могут содержать другие списки, хотя можно имитировать вложенные списки, используя правила обращений к переменным в расширении переменных.
Когда список экспортируется как переменная среды, он разграничивается пробелами или двоеточиями, в зависимости от того, является ли это переменной пути:
set -x smurf blue small set -x smurf_PATH forest mushroom env | grep smurf # smurf=blue small # smurf_PATH=forest:mushroom
fish автоматически создает списки из всех переменных среды, имена которых заканчиваются на PATH, разбивая их по двоеточиям. Другие переменные не разбиваются автоматически.
Переменные PATH
Переменные PATH — это специальный тип переменных, используемых для поддержки списков путей, разделяемых двоеточиями, включая PATH, CDPATH, MANPATH, PYTHONPATH и т. д. Все переменные, заканчивающиеся на PATH (регистрозависимые), становятся переменными PATH.
Переменные PATH ведут себя как обычные списки, но они неявно объединяются и разделяются по двоеточиям.
set MYPATH 1 2 3 echo "$MYPATH" # 1:2:3 set MYPATH "$MYPATH:4:5" echo $MYPATH # 1 2 3 4 5 echo "$MYPATH" # 1:2:3:4:5
Переменные могут быть помечены или помечены как переменные PATH с помощью --path и --unpath параметров set.
Специальные переменные
Пользователь может изменить настройки fish путем изменения значений определенных переменных.
-
PATH, список директорий для поиска команд -
CDPATH, список директорий для поиска новой директории для встроенной командыcd. -
LANG,LC_ALL,LC_COLLATE,LC_CTYPE,LC_MESSAGES,LC_MONETARY,LC_NUMERICиLC_TIMEустанавливают языковой параметр для оболочки и подпрограмм. Более подробная информация в разделе Переменные локали. - Большое количество переменных, начинающихся с префиксов
fish_colorиfish_pager_color. Более подробная информация в разделе Переменные для изменения цветов выделения. -
fish_emoji_widthуправляет вычисленной шириной некоторых символов, в частности эмодзи, чья рендерная ширина изменилась в Unicode 9 и, следовательно, меняется в разных эмуляторах терминалов. Это значение должно быть установлено в 2, если ваш эмулятор терминала поддерживает Unicode >= 9 и отображает их с двойной шириной, и в 1 в противном случае. Устанавливайте только в случае графических артефактов при выводе эмодзи, обычно оно автоматически определяется. -
fish_ambiguous_widthуправляет вычисленной шириной символов с неоднозначной шириной. Это значение должно быть установлено в 1, если ваш эмулятор терминала отображает эти символы как символы одинарной ширины (типичный случай), или в 2, если двойной ширины. -
fish_escape_delay_msпереопределяет значение таймаута по умолчанию в 30 мс после появления escape-символа, прежде чем отказываться от сопоставления сочетания клавиш. Это объясняется в документации для встроенной команды bind. Этот интервал позволяет использовать escape как мета-клавишу. -
fish_greeting, сообщение приветствия, отображаемое при запуске. -
fish_history, имя текущей сессии истории. Если установлено, все последующие команды в интерактивной сессии fish будут записаны в отдельный файл, определённый значением переменной. Если не установлено или установлено вdefault, используется имя сессии по умолчанию «fish». Если установлено в пустую строку, история не сохраняется на диск (но доступна в интерактивной сессии). -
fish_trace, если установлено и не пустое, заставит fish выводить команды перед их выполнением, подобноset -xв bash. Отладочная информация выводится в путь, указанный параметром --debug-output для fish (stderr по умолчанию). -
fish_user_paths, список директорий, которые добавляются в началоPATH. Это может быть универсальная переменная. -
umask, текущая маска создания файлов. Лучший способ изменения переменной umask — через функцию umask. Попытка установить umask в недопустимое значение всегда завершится неудачей. -
BROWSER, предпочтительный веб-браузер пользователя. Если эта переменная установлена, fish будет использовать указанный браузер вместо системного по умолчанию для отображения документации fish.
fish также предоставляет пользователю дополнительную информацию через значения определенных переменных среды. Пользователь не может изменить значения большинства из этих переменных.
-
_, имя текущей выполняемой команды (хотя это устарело, и предпочтительнее использованиеstatus current-command). -
argv, список аргументов для оболочки или функции.argvопределено только при вызове функции или если fish был вызван со списком аргументов, какfish myscript.fish foo bar. Эту переменную можно изменить пользователю. -
history, список последних введённых команд. -
HOME, домашний каталог пользователя. Эту переменную можно изменить пользователю. -
hostname, имя хоста компьютера. -
IFS, внутренний разделитель, используемый для разделения слов при использовании встроенной команды read. Установка этого значения в пустую строку также отключит разделение строк в подстановке команд. Эту переменную можно изменить пользователю. -
PWD, текущая рабочая директория. -
status, код возврата последнего завершившегося фонового задания. Если задание было завершено с помощью сигнала, код возврата будет 128 плюс номер сигнала. -
pipestatus, список кодов возврата всех процессов, из которых состояла последняя выполненная труба. -
USER, текущее имя пользователя. Эту переменную можно изменить пользователю. -
CMD_DURATION, время выполнения последней команды в миллисекундах. -
version, версия текущей запущенной fish (также доступна какFISH_VERSIONдля обратной совместимости). -
SHLVL, уровень вложенности оболочек. -
COLUMNSиLINES, текущий размер терминала по высоте и ширине. Эти значения используются fish только если операционная система не сообщает размер терминала. В этом случае обе переменные должны быть установлены, иначе будет использоваться значение по умолчанию 80x24. Они обновляются при изменении размера окна.
Названия этих переменных в основном взяты из семейства оболочек csh и отличаются от используемых оболочками стиля Bourne, такими как bash.
Переменные, имена которых написаны заглавными буквами, обычно экспортируются в команды, запускаемые с помощью fish, в то время как переменные с маленькими буквами не экспортируются (CMD_DURATION — исключение по историческим причинам). Это правило не проверяется fish, но использование разного регистра для различения экспортируемых и неэкспортируемых переменных является хорошей практикой программирования. fish также использует несколько внутренних переменных. Такие переменные имеют префиксы __FISH или __fish.. Пользователям не следует их использовать. Изменение их значения может привести к ошибке работы fish.
Переменная состояния
При завершении процесса возвращается код завершения программе, которая его запустила (обычно оболочке). Этот код завершения — целое число, которое указывает вызывающему приложению, как прошла команда. В общем случае код завершения 0 означает, что команда выполнилась без проблем, а ненулевой код завершения означает наличие проблемы.
Fish сохраняет код завершения последнего завершенного процесса в переменной status.
Если fish столкнется с проблемой при выполнении команды, переменная состояния также может быть установлена в определённое значение:
- 0 — обычно код завершения команд fish, если они успешно выполнили запрошенную операцию.
- 1 — обычно код завершения команд fish, если они не смогли выполнить запрошенную операцию.
- 121 — обычно код завершения команд fish, если им были переданы некорректные аргументы.
- 123 означает, что команда не была выполнена, потому что имя команды содержало недопустимые символы.
- 124 означает, что команда не была выполнена, потому что ни один из шаблонов в команде не дал совпадений.
- 125 означает, что хотя исполняемый файл с указанным именем был найден, операционная система не смогла запустить команду.
- 126 означает, что хотя файл с указанным именем был найден, он не был исполняемым.
- 127 означает, что не было найдено ни функции, ни встроенной команды, ни команды с заданным именем.
Если процесс завершается по сигналу, код завершения будет равен 128 плюс номер сигнала.
Переменные для изменения цветов выделения
Цвета, используемые fish для синтаксического выделения, можно настроить, изменив значения различных переменных. Значение этих переменных может быть одним из цветов, принятых командой set_color. Также принимаются переключатели --bold или -b, принятые командой set_color.
Для изменения цветов выделения в fish доступны следующие переменные:
-
fish_color_normal, цвет по умолчанию -
fish_color_command, цвет для команд -
fish_color_quote, цвет для блоков текста в кавычках -
fish_color_redirection, цвет для перенаправлений ввода-вывода -
fish_color_end, цвет для разделителей процессов, таких как ';' и '&' -
fish_color_error, цвет для выделения потенциальных ошибок -
fish_color_param, цвет для обычных параметров команд -
fish_color_comment, цвет для комментариев к коду -
fish_color_match, цвет для выделения соответствующих скобок -
fish_color_selection, цвет для выделения текста при выборе (в режиме vi) -
fish_color_search_match, используется для выделения совпадений в истории поиска и выбранного элемента в просмотрщике (должен быть фоном) -
fish_color_operator, цвет для операторов расширения параметров, таких как '*' и '~' -
fish_color_escape, цвет для выделения управляющих символов, таких как '\n' и '\x70' -
fish_color_cwd, цвет для текущей рабочей директории в командной строке по умолчанию -
fish_color_autosuggestion, цвет для автодополнений -
fish_color_user, цвет для отображения текущего имени пользователя в некоторых стандартных командных строках fish -
fish_color_host, цвет для отображения текущей системы в некоторых стандартных командных строках fish -
fish_color_host_remote, цвет для отображения текущей системы в некоторых стандартных командных строках fish, если fish запущена удаленно (через ssh или аналогично) -
fish_color_cancel, цвет для индикатора '^C' при отмене команды
Кроме того, для изменения выделения в просмотрщике завершения доступны следующие переменные:
-
fish_pager_color_progress, цвет полосы прогресса в левом нижнем углу -
fish_pager_color_background, цвет фона строки -
fish_pager_color_prefix, цвет префиксной строки, т.е. строки, которая должна быть дополнена -
fish_pager_color_completion, цвет завершения -
fish_pager_color_description, цвет описания завершения -
fish_pager_color_secondary_background,fish_pager_color_backgroundкаждой второй невыбранной строки завершения. По умолчаниюfish_pager_color_background -
fish_pager_color_secondary_ prefix,fish_pager_color_prefixкаждой второй невыбранной строки завершения. По умолчаниюfish_pager_color_prefix -
fish_pager_color_secondary_completion,fish_pager_color_completionкаждой второй невыбранной строки завершения. По умолчаниюfish_pager_color_completion -
fish_pager_color_secondary_description,fish_pager_color_descriptionкаждой второй невыбранной строки завершения. По умолчаниюfish_pager_color_description -
fish_pager_color_selected_background,fish_pager_color_backgroundвыделенной строки завершения. По умолчаниюfish_color_search_match -
fish_pager_color_selected_prefix,fish_pager_color_prefixвыделенной строки завершения. По умолчаниюfish_pager_color_prefix -
fish_pager_color_selected_completion,fish_pager_color_completionвыделенной строки завершения. По умолчаниюfish_pager_color_completion -
fish_pager_color_selected_description,fish_pager_color_descriptionвыделенной строки завершения. По умолчаниюfish_pager_color_description
Пример:
Чтобы выделить ошибки красным цветом, используйте:
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 отличается удобством в интерактивном использовании. Это обусловлено несколькими особенностями, которые мы объясним в следующих разделах.
Помощь
fish имеет обширную систему справки. Используйте команду help, чтобы получить справку по конкретной теме или команде. Например, написание help syntax отображает раздел синтаксиса данного документа.
fish также имеет страницы справки (man pages) для своих команд. Например, man set покажет документацию для set как страницу справки.
Справку по конкретной встроенной команде также можно получить с помощью параметра -h. Например, чтобы получить справку по встроенной команде fg, можно набрать fg -h или help fg.
Автодополнения
Fish предлагает команды по мере ввода, основываясь на истории команд, завершениях и допустимых путях к файлам. По мере ввода команд вы увидите предложение после курсора серым цветом (который можно изменить с помощью переменной fish_color_autosuggestion).
Для принятия автодополнения (заменяющего содержимое командной строки) нажмите правую стрелку или Control+F. Для принятия первого предложенного слова нажмите Alt+→,Right или Alt+F. Если автодополнение не то, что вам нужно, просто проигнорируйте его: оно не будет выполнено, пока вы его не примете.
Автодополнения — мощный способ быстро вызвать часто используемые команды, набрав первые несколько символов. Они также являются эффективным методом навигации по иерархии директорий.
Автозавершение по нажатию клавиши Tab
Автозавершение по нажатию клавиши Tab — одна из самых экономичных функций любой современной оболочки. Нажав клавишу Tab, пользователь просит fish угадать оставшуюся часть команды или параметра, который пользователь вводит в данный момент. Если fish может найти только одно возможное завершение, fish запишет его. Если существует более одного завершения, fish запишет самую длинную общую префиксную часть всех завершений. Если завершения отличаются по первому символу, печатается список всех возможных завершений. Список содержит описания завершений, и если список не помещается на экране, его можно прокручивать с помощью клавиш со стрелками, клавиш Page Up/Page Down, клавиши Tab или пробела.
Если список отображается, нажатие клавиши Control-S (или привязанная к ней комбинация pager-toggle-search) позволит фильтровать список. Нажатие Shift-Tab (или комбинация complete-and-search) вызовет завершение со сразу видимым поисковым полем. Это общие функции автозавершения, которые предоставляет 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.
В качестве более содержательного примера, вот комментированный фрагмент автодополнений для timedatectl systemd:
# All subcommands that timedatectl knows - this is useful for later. set -l commands status set-time set-timezone list-timezones set-local-rtc set-ntp # Disable file completions for the entire command # because it does not take files anywhere # Note that this can be undone by using "-F". # # File completions also need to be disabled # if you want to have more control over what files are offered (e.g. just directories, or just files ending in ".mp3"). complete -c timedatectl -f # This line offers the subcommands # -"status", # -"set-timezone", # -"set-time" # -"list-timezones" # if no subcommand has been given so far. # # The `-n`/`--condition` option takes script as a string, which it executes. # If it returns true, the completion is offered. # Here the condition is the `__fish_seen_subcommands_from` helper function. # If returns true if any of the given commands is used on the commandline, # as determined by a simple heuristic. # For more complex uses, you can write your own function. # See e.g. the git completions for an example. # complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" -a "status set-time set-timezone list-timezones" # If the "set-timezone" subcommand is used, # offer the output of `timedatectl list-timezones` as completions. # Each line of output is used as a separate candidate, # and anything after a tab is taken as the description. # It's often useful to transform command output with `string` into that form. complete -c timedatectl -n "__fish_seen_subcommand_from set-timezone" -a "(timedatectl list-timezones)" # Completion candidates can also be described via `-d`, # which is useful if the description is constant. # Try to keep these short, because that means the user gets to see more at once. complete -c timedatectl -n "not __fish_seen_subcommand_from $commands" -a "set-local-rtc" -d "Maintain RTC in local time" # We can also limit options to certain subcommands by using conditions. complete -c timedatectl -n "__fish_seen_subcommand_from set-local-rtc" -l adjust-system-clock -d 'Synchronize system clock from the RTC' # These are simple options that can be used everywhere. complete -c timedatectl -s h -l help -d 'Print a short help text and exit' complete -c timedatectl -l version -d 'Print a short version string and exit' complete -c timedatectl -l no-pager -d 'Do not pipe output into a pager'
Для примеров написания собственных сложных автодополнений изучите автодополнения в /usr/share/fish/completions. (Точный путь зависит от выбранного префикса установки и может незначительно отличаться)
Полезные функции для написания автодополнений
fish поставляется с несколькими функциями, которые очень полезны при написании автодополнений для конкретной команды. Большинство из этих функций начинаются со строки '__fish_'. Такие функции являются внутренними для fish и их имя и интерфейс могут измениться в будущих версиях fish. Тем не менее, некоторые из них могут быть очень полезны при написании автодополнений. Здесь описаны несколько из этих функций. Имейте в виду, что они могут быть удалены или изменены в будущих версиях fish.
Функции, начинающиеся со строки __fish_print_, выводят список строк, разделённых новой строкой. Например, __fish_print_filesystems выводит список всех известных файловых систем. Функции, начинающиеся со строки __fish_complete_, выводят список автодополнений с описаниями, разделёнными табуляцией.
-
__fish_complete_directories STRING DESCRIPTIONвыполняет автодополнение пути для STRING, разрешая только каталоги и предоставляя описание DESCRIPTION. -
__fish_complete_path STRING DESCRIPTIONвыполняет автодополнение пути для STRING, предоставляя описание DESCRIPTION. -
__fish_complete_groupsвыводит список всех пользовательских групп с членами групп в качестве описания. -
__fish_complete_pidsвыводит список всех идентификаторов процессов с именем команды в качестве описания. -
__fish_complete_suffix SUFFIXвыполняет автодополнение файлов, разрешая только файлы, оканчивающиеся на SUFFIX, с необязательным описанием. -
__fish_complete_usersвыводит список всех пользователей с полными именами в качестве описания. -
__fish_print_filesystemsвыводит список всех известных файловых систем. В настоящее время это статический список и не зависит от файловых систем, которые фактически понимает операционная система хоста. -
__fish_print_hostnamesвыводит список всех известных хостов. Эта функция ищет в fstab NFS-серверы, в 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; - Каталоги для поставщиков программного обеспечения сторонних производителей для распространения собственных автодополнений для своего программного обеспечения. Fish ищет каталоги в переменной среды
XDG_DATA_DIRSдля каталогаfish/vendor_completions.d; если эта переменная не определена, по умолчанию используется поиск в каталогах/usr/share/fish/vendor_completions.dи/usr/local/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. Ваша система установки должна поддерживать пользовательский путь для переопределения пути pkgconfig, так как другим дистрибутивам может потребоваться легко его изменить.
Редактор командной строки
Редактор 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
Общие сочетания клавиш
- Tab завершает текущий токен. Shift, Tab завершает текущий токен и запускает режим поиска пэджера.
- Alt+←,Left и Alt+→,Right перемещают курсор на одно слово влево или вправо (до следующего пробела или знака препинания), или перемещаются вперед/назад в истории команд, если командная строка пуста. Если курсор уже находится в конце строки, и доступно автопредложение, Alt+→,Right (или Alt+F) принимает первое слово в предложении.
- Shift,←,Left и Shift,→,Right перемещают курсор на одно слово влево или вправо, не останавливаясь на знаках препинания.
- ↑ (Вверх) и ↓ (Вниз) (или Control+P и Control+N для любителей Emacs) ищут в истории команд предыдущую/следующую команду, содержащую строку, указанную в командной строке перед началом поиска. Если командная строка была пустой, когда поиск начался, все команды совпадают. Дополнительную информацию о поиске в истории см. в разделе истории.
- Alt+↑,Up и Alt+↓,Down ищут в истории команд предыдущий/следующий токен, содержащий токен под курсором перед началом поиска. Если командная строка не находилась на токене, когда поиск начался, все токены совпадают. Дополнительную информацию о поиске в истории см. в разделе истории.
- Control+C отменяет всю строку.
- Control+D удаляет один символ справа от курсора. Если командная строка пуста, Control+D завершит работу fish.
- Control+U перемещает содержимое от начала строки до курсора в буфер обмена.
- Control+L очищает и перерисовывает экран.
- Control+W перемещает предыдущий компонент пути (все до предыдущего "/", ":" или "@") в буфер обмена.
- Control+X копирует текущий буфер в буфер обмена системы, Control+V вставляет содержимое буфера обмена.
- Alt+d перемещает следующее слово в буфер обмена.
- Alt+h (или F1) отображает страницу справки для текущей команды, если она существует.
- Alt+l отображает содержимое текущей директории, если курсор не находится над аргументом-директорией, в этом случае будет отображено содержимое этой директории.
-
Alt+p добавляет строку '
| less;' в конец задания под курсором. Результатом является постраничный вывод команды. - Alt+w выводит краткое описание команды под курсором.
-
Alt+e редактирует текущую командную строку в внешнем редакторе. Редактор выбирается из первого доступного из переменных
$VISUALили$EDITOR. - Alt+v То же, что и Alt+e.
-
Alt+s Добавляет
sudoк текущей командной строке.
Команды режима 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 в командной строке. Изначально активен режим вставки. Escape переходит в режим команд. Команды, доступные в режиме команд, вставки и визуального режима, описаны ниже. Режим 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_default_mode_prompt.
При переключении режима с помощью сочетания клавиш будет перерисован индикатор режима, если он существует, и остальная часть приглашения, только если он не существует. Поэтому, если вам нужен индикатор режима в вашем fish_prompt, вам необходимо стереть fish_mode_prompt, например, добавив пустой файл в ~/.config/fish/functions/fish_mode_prompt.fish. (Сочетания клавиш, которые изменяют режим, должны вызывать функцию bind repaint-mode, см. bind)
Функция fish_vi_cursor будет использоваться для изменения формы курсора в зависимости от режима в поддерживаемых терминалах. Следующий фрагмент кода может использоваться для ручного настройки форм курсора после активации режима Vi:
# Emulates vim's cursor shape behavior # Set the normal and visual mode cursors to a block set fish_cursor_default block # Set the insert mode cursor to a line set fish_cursor_insert line # Set the replace mode cursor to an underscore set fish_cursor_replace_one underscore # The following variable can be used to configure cursor shape in # visual mode, but due to fish_cursor_default, is redundant here set fish_cursor_visual block
Кроме того, blink можно добавить после каждого параметра формы курсора для установки мигающего курсора в указанной форме.
Режим команд
Режим команд также известен как нормальный режим.
- h перемещает курсор влево.
- l перемещает курсор вправо.
- i переходит в режим вставки в текущей позиции курсора.
- v переходит в визуальный режим в текущей позиции курсора.
- a переходит в режим вставки после текущей позиции курсора.
- Shift,A переходит в режим вставки в конце строки.
- 0 (ноль) перемещает курсор в начало строки (оставаясь в режиме команд).
- dd удаляет текущую строку и перемещает ее в буфер обмена.
- Shift,D удаляет текст после текущей позиции курсора и перемещает его в буфер обмена.
- p вставляет текст из буфера обмена.
- u поиск в истории команд назад.
- [ и ] поиск в истории команд предыдущего/следующего токена, содержащего токен под курсором до начала поиска. См. раздел история для получения дополнительной информации о поиске в истории.
- Backspace перемещает курсор влево.
Режим вставки
- Escape переходит в режим команд.
- Backspace удаляет один символ влево.
Визуальный режим
- ← (Слева) и → (Справа) расширяют выделение назад/вперед на один символ.
- b и w расширяют выделение назад/вперед на одно слово.
- d и x перемещают выделение в буфер обмена и переходят в режим команд.
- Esc и Ctrl+C переходят в режим команд.
Копирование и вставка (Буфер обмена)
fish использует буфер обмена в стиле Emacs для копирования и вставки. Например, используйте Ctrl+K (kill-line) для вырезания от текущей позиции курсора до конца строки. Вырезанная строка (в emacs-терминологии — убитая) помещается в список вырезанных данных — буфер обмена. Чтобы вставить последнее значение из буфера обмена (в emacs — "выдернуть") используйте Ctrl+Y (функция ввода yank). После вставки, используйте Alt+Y (yank-pop) для вращения к предыдущему вырезанному фрагменту.
Поддержка копирования и вставки извне также реализована, как через комбинации Ctrl+X / Ctrl+V (функции fish_clipboard_copy и fish_clipboard_paste [4]), так и через функцию вставки терминала, для которой fish активирует "Режим вставки в скобках", чтобы отличать вставку от ввода текста вручную. Кроме того, при вставке внутри одинарных кавычек, вставленные одинарные кавычки и обратные слэши автоматически экранируются, так что результат можно использовать как один токен, просто закрыв кавычки.
| [4] | Они полагаются на внешние инструменты. В настоящее время поддерживаются xsel, xclip, wl-copy/wl-paste и pbcopy/pbpaste. |
Поисковая история
После ввода команды она добавляется в конец списка истории. Любые дублирующие элементы истории автоматически удаляются. Нажимая клавиши вверх и вниз, пользователь может просматривать историю вперед и назад. Если строка ввода не пуста при запуске поиска в истории, отображаются только команды, содержащие введенную строку.
Нажимая Alt+↑,Вверх и Alt+↓,Вниз, также выполняется поиск в истории, но вместо поиска по всей команде, каждая команда разбивается на отдельные элементы, так же как это происходит перед выполнением, и история просматривается в поисках элемента, соответствующего текущему под курсором.
Поиск в истории можно прервать, нажав клавишу Escape.
Представление команды пробелом предотвратит добавление всей строки в историю.
Журнал команд по умолчанию хранится в файле ~/.local/share/fish/fish_history (или $XDG_DATA_HOME/fish/fish_history, если эта переменная установлена). Однако, вы можете установить переменную среды fish_history, чтобы изменить имя сессии истории (что приведет к файлу <session>_history); как до запуска оболочки, так и во время её работы.
См. команду history для других манипуляций.
Примеры:
Чтобы найти предыдущие записи, содержащие слово 'make', введите make в консоли и нажмите клавишу вверх.
Если в строке ввода стоит cd m, поместите курсор над символом m и нажмите Alt+↑,Вверх, чтобы найти ранее введенные слова, содержащие 'm'.
Редактирование многострочных команд
Редактор командной строки fish может использоваться для работы с командами, состоящими из нескольких строк. Существует три способа сделать команду многострочной:
- Нажатие клавиши Enter при незакрытом блоке команд, например, когда одна или несколько командных блоков, таких как
for,beginилиif, не имеют соответствующей командыend. - Нажатие Alt+Enter вместо нажатия Enter.
- Вставка символа обратного слэша (
\) перед нажатием клавиши Enter, экранируя перевод строки.
Редактор командной строки fish работает одинаково в однострочном и многострочном режимах. Для перемещения между строками используйте стрелки влево и вправо и другие подобные сочетания клавиш.
Запуск нескольких программ
Обычно, когда fish запускает программу, эта программа переходит в фокус, что означает, что она получает управление терминалом, и fish приостанавливается до завершения программы. Иногда это нежелательно. Например, вы можете захотеть запустить приложение с графическим интерфейсом из терминала и продолжить работу с оболочкой. В таких случаях есть несколько способов изменить поведение fish.
- Завершив команду символом
&(амперсанд), пользователь сообщаетfishпоместить указанную команду в фоновый режим. Фоновый процесс будет работать одновременно сfish.fishсохранит управление терминалом, поэтому программа не сможет считывать данные с клавиатуры. - Нажав Ctrl+Z, пользователь останавливает работающую в фокусе программу и возвращает управление
fish. Некоторые программы не поддерживают эту функцию или переопределяют её на другую клавишу. GNU Emacs использует Ctrl+X z для остановки работы. - Используя встроенные команды bg и fg, пользователь может переместить любой запущенный процесс в фоновый или фокусный режим.
Обратите внимание, что функции не могут быть запущены в фоновом режиме. Функции, которые останавливаются и затем перезапускаются в фоновом режиме с помощью команды bg, не будут выполняться корректно.
Файлы инициализации
При запуске Fish оценивает ряд файлов конфигурации, которые можно использовать для управления поведением оболочки. Расположение этих файлов контролируется рядом переменных среды, а их стандартное или обычное расположение приведено ниже.
Файлы конфигурации оцениваются в следующем порядке:
- Конфигурация, поставляемая с fish, которую не следует редактировать, в
$__fish_data_dir/config.fish(обычно/usr/share/fish/config.fish). -
Файлы конфигурации в файлах, заканчивающихся на
.fish, в директориях:-
$__fish_config_dir/conf.d(по умолчанию,~/.config/fish/conf.d/) -
$__fish_sysconf_dir/conf.d(по умолчанию,/etc/fish/conf.d/) - Директории для поставщиков программного обеспечения сторонних производителей для поставки своих файлов конфигурации для их программного обеспечения. Fish ищет директории в переменной среды
XDG_DATA_DIRSдля директорииfish/vendor_conf.d; если эта переменная не определена, по умолчанию ищется/usr/share/fish/vendor_conf.dи/usr/local/share/fish/vendor_conf.d.
Если в этих директориях есть несколько файлов с одинаковым именем, будет выполнен только первый. Они выполняются в порядке их имени файла, отсортированные (как в glob) в естественном порядке (т.е. "01" сортируется раньше "2").
-
- Системные файлы конфигурации, где администраторы могут включать инициализацию, которая должна выполняться для всех пользователей системы — аналогично
/etc/profileдля оболочек в стиле POSIX — в$__fish_sysconf_dir(обычно/etc/fish/config.fish). - Пользовательские файлы инициализации, обычно в
~/.config/fish/config.fish(управляемые переменной средыXDG_CONFIG_HOME, доступной как$__fish_config_dir).
Эти пути управляются параметрами, установленным при компиляции, установке или запуске, и могут отличаться от значений по умолчанию, указанных выше.
Этот широкий поиск может быть запутанным. Если вы не уверены, куда поместить ваши собственные настройки, используйте ~/.config/fish/config.fish.
Обратите внимание, что ~/.config/fish/config.fish подключается _после_ фрагментов. Это позволяет пользователям копировать фрагменты и переопределять некоторые из их функций.
Все эти файлы выполняются при запуске каждой оболочки. Если вы хотите выполнить команду только при запуске интерактивной оболочки, используйте код возврата команды status --is-interactive, чтобы определить, является ли оболочка интерактивной. Если вы хотите запустить команду только при использовании оболочки входа, используйте status --is-login вместо этого. Это ускорит запуск неинтерактивных или не-входных оболочек.
Если вы разрабатываете другую программу, вам может понадобиться установить конфигурацию, которая выполняется для всех пользователей оболочки fish на системе. Это не рекомендуется; если это не написано тщательно, это может иметь побочные эффекты или замедлить запуск оболочки. Кроме того, пользователи других оболочек не будут извлечь выгоду от специфичной для Fish конфигурации. Однако, если они совершенно необходимы, вы можете установить их в директорию конфигурации "поставщика". Поскольку этот путь может меняться от системы к системе, для обнаружения этого пути следует использовать фреймворк 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-event fish_exit
echo fish is now exiting
end
Флаги будущих функций
Флаги функций — это способ, которым fish подготавливает изменения, которые могут сломать скрипты. Нарушающие изменения вводятся как опциональные, в нескольких выпусках они становятся опциональными и, в конечном итоге, старое поведение удаляется.
Вы можете увидеть текущий список функций с помощью status features:
> status features stderr-nocaret on 3.0 ^ no longer redirects stderr qmark-noglob off 3.0 ? no longer globs regex-easyesc off 3.1 string replace -r needs fewer \\'s
В fish 3.0 есть два нарушения: символ возведения в степень ^ больше не перенаправляет stderr, и вопрос ? больше не является глобом.
В fish 3.1 есть одно нарушение: string replace -r выполняет лишний раунд экранирования для замены, поэтому экранирование обратных слэшей будет выглядеть как string replace -ra '([ab])' '\\\\\\\$1' a. Этот флаг удаляет это, если он включен, поэтому '\\\\$1' достаточно.
Эти изменения отключены по умолчанию. Их можно включить на основе каждой сессии:
> fish --features qmark-noglob,stderr-nocaret
или включить глобально для пользователя:
> set -U fish_features stderr-nocaret qmark-noglob
Функции будут установлены только при запуске, поэтому эта переменная вступит в силу только если она универсальна или экспортирована.
Вы также можете использовать версию как группу, поэтому 3.0 эквивалентно "stderr-nocaret" и "qmark-noglob".
Префикс функции с no- отключает её. .. _other:
Другие возможности
Подсветка синтаксиса
fish интерпретирует командную строку по мере ввода и использует подсветку синтаксиса, чтобы дать обратную связь пользователю. Наиболее важной является проверка на потенциальные ошибки. По умолчанию ошибки помечены красным цветом.
Обнаруженные ошибки включают:
- Несуществующие команды.
- Чтение из или добавление в несуществующий файл.
- Неправильное использование перенаправления вывода.
- Несоответствующие скобки.
Когда курсор находится над скобкой или кавычкой, fish также подсвечивает соответствующую кавычку или скобку.
Для настройки подсветки синтаксиса можно установить переменные среды, перечисленные в разделе Переменные для изменения цветов подсветки.
Настраиваемое заголовок
При использовании большинства виртуальных терминалов можно установить сообщение, отображаемое в строке заголовка окна терминала. Это можно сделать автоматически в fish, определив функцию fish_title. Функция fish_title выполняется до и после выполнения новой команды или её перевода в фоновый режим, а вывод используется в качестве сообщения в строке заголовка. Встроенная функция status current-command всегда возвращает имя задачи, которая должна быть переведена в фоновый режим (или 'fish', если управление возвращается в оболочку) при вызове функции fish_prompt. Первый аргумент fish_title будет содержать последнюю выполненную команду в фоновом режиме в виде строки, начиная с fish 2.2.
Примеры: По умолчанию заголовок fish:
function fish_title
echo (status current-command) ' '
pwd
end
Чтобы отобразить последнюю команду в заголовке:
function fish_title
echo $argv[1]
end
Настраиваемая строка приглашения
Когда fish ожидает ввода, он отобразит строку приглашения, оценив функции fish_prompt и fish_right_prompt. Вывод первого отображается слева, а вывод последнего — справа в терминале. Вывод fish_mode_prompt будет добавлен слева, хотя по умолчанию функция делает это только в режиме vi.
Настраиваемое приветствие
Если существует функция с именем fish_greeting, она будет выполнена при входе в интерактивный режим. В противном случае, если существует переменная среды с именем fish_greeting, она будет напечатана.
Режим конфиденциальности
fish поддерживает запуск в режиме конфиденциальности через fish --private (или fish -P для краткости). В режиме конфиденциальности старая история недоступна, и любые интерактивные команды, которые вы выполняете, не будут добавлены в глобальный файл истории, что полезно как для предотвращения непреднамеренного раскрытия личной информации (например, для видеозаписи экрана), так и при работе с конфиденциальной информацией, чтобы предотвратить её сохранение на диске. Вы можете запросить глобальную переменную fish_private_mode` (if set -q fish_private_mode ...), если хотите учесть пожелания пользователя относительно конфиденциальности и изменить поведение собственных скриптов fish.
Обработчики событий
При определении новой функции в fish её можно сделать обработчиком событий, т.е. функцией, которая автоматически выполняется при наступлении определённого события. В настоящее время события, которые могут вызывать обработчик:
- При получении сигнала.
- При завершении процесса или задачи.
- При обновлении значения переменной.
- При отображении строки приглашения.
- При неудачном поиске команды.
Пример:
Чтобы указать обработчик сигналов для сигнала WINCH, напишите:
function my_signal_handler --on-signal WINCH
echo Got WINCH signal!
end
Обратите внимание, что обработчики событий активируются только при загрузке функции, что означает, что вам может потребоваться выполнить source или выполнить функцию вместо полагания на автозагрузку. Одним из подходов является размещение её в вашем файле инициализации.
Дополнительную информацию о том, как определять новые обработчики событий, см. в документации для команды function.
Отладка скриптов fish
Fish включает встроенную отладочную утилиту. Отладчик позволяет остановить выполнение скрипта в произвольной точке. В этот момент отображается интерактивная строка приглашения. В этом приглашении вы можете выполнить любую команду fish (специальных команд отладки как таковых нет). Например, вы можете проверить или изменить значение любой переменной с помощью printf и set. В качестве другого примера, вы можете выполнить status print-stack-trace , чтобы увидеть, как была достигнута эта точка останова. Чтобы возобновить обычное выполнение скрипта, просто введите exit или [ctrl-D].
Чтобы начать сеанс отладки, просто выполните встроенную команду breakpoint в той части функции или скрипта, где вы хотите получить контроль. Также по умолчанию действие сигнала TRAP заключается в вызове этой встроенной команды. Таким образом, запущенный скрипт можно отладить, отправив ему сигнал TRAP с помощью команды kill. После попадания в отладчик легко вставить новые точки останова, используя функцию funced для редактирования определения функции.
Дополнительная помощь и разработка
Если у вас есть вопрос, на который не отвечает данная документация, есть несколько способов получить помощь:
- Официальный список рассылки по адресу fish-users@lists.sourceforge.net
- Канал IRC, #fish на
irc.oftc.net - Страница проекта на GitHub https://github.com/fish-shell/fish-shell/
Если у вас есть предложение по улучшению fish, вы можете отправить его через список рассылки или страницу GitHub.
Другие страницы справки
© 2019 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.1/index