Spec-Zone.ru › Fish 3.6

Руководство

Почему fish?

Fish — это полностью укомплектованная командная оболочка (как bash или zsh), которая умна и удобна в использовании. Fish поддерживает мощные функции, такие как подсветка синтаксиса, автодополнение и завершение по табу, которые работают без каких-либо настроек или обучения.

Если вы хотите сделать свою командную строку более продуктивной, полезной и интересной, не изучая сложный синтаксис и опции конфигурации, то fish — именно то, что вам нужно!

Начало работы

После установки просто введите fish в вашей текущей оболочке, чтобы попробовать!

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

> fish
Welcome to fish, the friendly interactive shell
Type help for instructions on how to use fish
you@hostname ~>

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

Отныне мы будем использовать > для экономии места.

Изучение fish

Это руководство предполагает базовое понимание командных оболочек и команд Unix, а также наличие рабочей копии fish.

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

Или, если вы хотите краткий обзор отличий от других оболочек, таких как Bash, см. Fish для пользователей Bash.

Для подробного описания интерактивного использования fish см. Интерактивное использование.

Для полного описания языка сценариев fish см. Язык Fish.

Выполнение команд

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

> echo hello world
hello world

Это выполняет команду echo с аргументами hello и world. В этом случае это одно и то же, что и один аргумент hello world, но во многих случаях это не так. Если вам нужно передать аргумент, содержащий пробел, вы можете использовать обратный слэш для экранирования или цитаты с использованием одинарных или двойных кавычек:

> mkdir My\ Files
# Makes a directory called "My Files", with a space in the name
> cp ~/Some\ File 'My Files'
# Copies a file called "Some File" in the home directory to "My Files"
> ls "My Files"
Some File

Получение справки

Запустите help для открытия справки fish в веб-браузере и man с этой страницей (например, fish-language) для открытия в справке man. Вы также можете запросить справку по конкретной команде, например, help set для открытия в веб-браузере или man set для просмотра в терминале.

> man set
set - handle shell variables
  Synopsis...

Для открытия этого раздела используйте help getting-help.

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

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

Вы быстро заметите, что fish выполняет подсветку синтаксиса по мере ввода. Неверные команды по умолчанию отображаются красным цветом:

> /bin/mkd

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

> /bin/mkdir

Действительные пути к файлам подчёркиваются при вводе:

> cat ~/somefi

Это сообщает вам, что существует файл, начинающийся с somefi, что является полезной обратной связью при вводе.

Эти цвета, и многие другие, можно изменить, выполнив fish_config, или изменив переменные цвета непосредственно.

Например, если вы хотите отключить (почти) всю подсветку:

fish_config theme choose none

Это выбирает тему «none». Чтобы увидеть все темы:

fish_config theme show

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

Подстановки

Fish поддерживает знакомые подстановки *. Чтобы перечислить все файлы JPEG:

> ls *.jpg
lena.jpg
meena.jpg
santa maria.jpg

Вы можете включить несколько подстановок:

> ls l*.p*
lena.png
lesson.pdf

Рекурсивная подстановка ** ищет каталоги рекурсивно:

> ls /var/**.log
/var/log/system.log
/var/run/sntp.log

Если эта обход каталогов занимает много времени, вы можете прервать её нажав Control+C.

Для более подробной информации см. Подстановки.

Каналы и перенаправления

Вы можете передавать команды друг другу с помощью обычной вертикальной черты:

> echo hello world | wc
      1       2      12

stdin и stdout можно перенаправить с помощью знакомых < и >. stderr перенаправляется с помощью 2>.

> grep fish < /etc/shells > ~/output.txt 2> ~/errors.txt

Для перенаправления stdout и stderr в один файл можно использовать &>.

> make &> make_output.txt

Для более подробной информации см. Перенаправление ввода и вывода и Каналы.

Автодополнение

По мере ввода fish будет предлагать команды справа от курсора серым цветом. Например:

> /bin/hostname

Он знает о путях и параметрах:

> grep --ignore-case

И истории тоже. Введите команду один раз, и вы сможете её снова вызвать, просто набрав несколько букв:

> rsync -avze ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo

Для принятия автодополнения нажмите → (стрелка вправо) или Control+F. Для принятия только одного слова автодополнения, нажмите Alt+→ (стрелка вправо). Если автодополнение не то, что вам нужно, просто проигнорируйте его.

Если вы не хотите автодополнений, вы можете отключить их, установив $fish_autosuggestion_enabled в 0:

set -g fish_autosuggestion_enabled 0

Завершение по табу

Набор функций завершения по табу работает «из коробки».

Нажмите Tab, и fish попытается завершить команду, аргумент или путь:

> /priTab => /private/

Если существует более одной возможности, он их перечислит:

> ~/stuff/sTab
~/stuff/script.sh  (command)  ~/stuff/sources/  (directory)

Нажмите Tab еще раз, чтобы перейти к другим вариантам. Часть в скобках (команда и каталог) — это описание завершения. Это просто краткое пояснение, какой тип аргумента это.

fish также может завершать многие команды, такие как ветки git:

> git merge prTab => git merge prompt_designer
> git checkout bTab
builtin_list_io_merge (Branch)  builtin_set_color (Branch) busted_events (Tag)

Попробуйте нажать Tab и посмотреть, что может сделать fish!

Переменные

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

> echo My home directory is $HOME
My home directory is /home/tutorial

Это известно как подстановка переменных, и это также происходит в двойных кавычках, но не в одинарных:

> echo "My current directory is $PWD"
My current directory is /home/tutorial
> echo 'My current directory is $PWD'
My current directory is $PWD

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

> set name 'Mister Noodle'
> echo $name
Mister Noodle

(Обратите внимание на кавычки: без них Mister и Noodle были бы отдельными аргументами, а $name бы было преобразовано в список из двух элементов.)

В отличие от других оболочек, переменные не разделяются после подстановки:

> mkdir $name
> ls
Mister Noodle

В bash это создало бы два каталога «Mister» и «Noodle». В fish был создан только один: переменная имела значение «Mister Noodle», поэтому это был аргумент, переданный mkdir, со всеми пробелами.

Вы можете удалить (или «удалить») переменную с помощью -e или --erase.

> set -e MyVariable
> env | grep MyVariable
(no output)

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

Экспорт (Переменные оболочки)

Иногда вам нужно, чтобы переменная была доступна внешней команде, часто как настройка. Например, многие программы, такие как git или man, читают переменную $PAGER, чтобы определить ваш предпочтительный просмотрщик страниц (программа, которая позволяет просматривать текст). Другие переменные, используемые таким образом, включают $BROWSER, $LANG (для настройки языка) и $PATH . Вы заметите, что они написаны заглавными буквами, но это просто конвенция.

Чтобы передать переменную внешней команде, она должна быть «экспортирована». Это делается с помощью флага к set, либо --export, либо просто -x.

> set -x MyVariable SomeValue
> env | grep MyVariable
MyVariable=SomeValue

Она также может быть исключена из экспорта с помощью --unexport или -u.

Это работает и в обратном порядке! Если fish запускается чем-то другим, оно наследует экспортированные переменные родителя. Таким образом, если ваш эмулятор терминала запускает fish, и он экспортирует $LANG со значением en_US.UTF-8, fish получит эту настройку. И всё, что запустило ваш эмулятор терминала, также передало ему некоторые переменные, которые оно передаст, если не решит их не передавать. Так fish обычно получает значения таких вещей как $LANG, $PATH и $TERM, без необходимости их повторного указания.

Экспортированные переменные могут быть локальными, глобальными или универсальными — «экспортированные» — это не область видимости! Обычно вы сделаете их глобальными с помощью set -gx MyVariable SomeValue.

Для более подробной информации см. Экспорт переменных.

END_OF_DOCUMENT_MARKER

Списки

Команда set выше использовала кавычки, чтобы гарантировать, что Mister Noodle был одним аргументом. Если бы это были два аргумента, то name был бы списком длины 2. На самом деле, все переменные в fish на самом деле являются списками, которые могут содержать любое количество значений или вообще не содержать.

У некоторых переменных, например, $PWD, есть только одно значение. По соглашению, мы говорим о значении этой переменной, но на самом деле мы имеем в виду её первое (и единственное) значение.

Другие переменные, например, $PATH, действительно содержат несколько значений. Во время расширения переменной переменная расширяется, чтобы стать несколькими аргументами:

> echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin

Переменные, имя которых заканчивается на «PATH», автоматически разбиваются по двоеточиям, чтобы стать списками. Они объединяются с помощью двоеточий при экспорте в подкоманды. Это делается для совместимости с другими инструментами, которые ожидают, что $PATH будет использовать двоеточия. Вы также можете явно добавить эту особенность к переменной с помощью set --path, или удалить её с помощью set --unpath.

Списки не могут содержать другие списки: рекурсии нет. Переменная — это список строк, и всё.

Получить длину списка можно с помощью count:

> count $PATH
5

Вы можете добавить (или вставить) в список, установив список себе, с некоторыми дополнительными аргументами. Здесь мы добавляем /usr/local/bin в $PATH:

> set PATH $PATH /usr/local/bin

Вы можете получить доступ к отдельным элементам с помощью квадратных скобок. Нумерация начинается с 1 с начала и с -1 с конца:

> echo $PATH
/usr/bin /bin /usr/sbin /sbin /usr/local/bin
> echo $PATH[1]
/usr/bin
> echo $PATH[-1]
/usr/local/bin

Вы также можете получить доступ к диапазонам элементов, известным как «срезы»:

> echo $PATH[1..2]
/usr/bin /bin
> echo $PATH[-1..2]
/usr/local/bin /sbin /usr/sbin /bin

Вы можете итерировать по списку (или срезу) с помощью цикла for:

for val in $PATH
  echo "entry: $val"
end
# Will print:
# entry: /usr/bin/
# entry: /bin
# entry: /usr/sbin
# entry: /sbin
# entry: /usr/local/bin

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

> set a 1 2 3
> set 1 a b c
> echo $a$1
1a 2a 3a 1b 2b 3b 1c 2c 3c
> echo $a" banana"
1 banana 2 banana 3 banana
> echo "$a banana"
1 2 3 banana

Это аналогично расширению фигурных скобок.

Для более подробной информации см. Списки.

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

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

> echo In (pwd), running $(uname)
In /home/tutorial, running FreeBSD

Распространённый приём — захват вывода команды в переменную:

> set os (uname)
> echo $os
Linux

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

> touch "testing_$(date +%s).txt"
> ls *.txt
testing_1360099791.txt

В отличие от других оболочек, fish не разбивает подстановки команд на пробелы (такие как пробелы или табуляции), только на новые строки. Обычно это большая помощь, потому что unix-команды работают на основе строки за строкой. Иногда это может быть проблемой с командами, такими как pkg-config , которые печатают то, что должно быть несколькими аргументами, в одной строке. Чтобы разбить его и на пробелы, используйте string split.

> printf '%s\n' (pkg-config --libs gio-2.0)
-lgio-2.0 -lgobject-2.0 -lglib-2.0
> printf '%s\n' (pkg-config --libs gio-2.0 | string split -n " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0

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

> echo "first line
second line" > myfile
> set myfile "$(cat myfile)"
> printf '|%s|' $myfile
|first line
second line|

Для более подробной информации см. Подстановку команд.

Разделение команд (точка с запятой)

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

Чтобы написать их в одной строке, используйте точку с запятой (;). Это означает, что следующие два примера эквивалентны:

echo fish; echo chips

# or
echo fish
echo chips

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

Код выхода

Когда команда завершается, она возвращает код состояния в виде целого положительного числа (то есть целое число ≥ 0).

В отличие от других оболочек, fish хранит код состояния последней команды в $status вместо $?.

> false
> echo $status
1

Это указывает, как прошла команда — 0 обычно означает успех, в то время как другие означают различные виды ошибок. Например, set --query возвращает количество запрошенных переменных, которые не были установлены — set --query PATH обычно возвращает 0, set --query arglbargl boogagoogoo обычно возвращает 2.

Также существует список переменных $pipestatus для кодов состояния [1] процессов в конвейере.

Для более подробной информации см. Переменную состояния.

[1]

или «статусы», если вам так нравится, или «статусы» если вы путешествовали во времени из Древнего Рима или работаете учителем латыни

Комбинаторы (И, Или, Не)

fish поддерживает знакомые && и || для объединения команд и ! для их отрицания:

> ./configure && make && sudo make install

Здесь, make выполняется только в том случае, если ./configure выполняется успешно (возвращает 0), и sudo make install выполняется только в том случае, если ./configure и make выполнились успешно.

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

> cp file1 file1_bak && cp file2 file2_bak; and echo "Backup successful"; or echo "Backup failed"
Backup failed

Как упоминалось в разделе точка с запятой, это также можно записать на нескольких строках, например:

cp file1 file1_bak && cp file2 file2_bak
and echo "Backup successful"
or echo "Backup failed"

Условные операторы (If, Else, Switch)

Используйте if и else для условного выполнения кода, в зависимости от кода выхода команды.

if grep fish /etc/shells
    echo Found fish
else if grep bash /etc/shells
    echo Found bash
else
    echo Got nothing
end

Для сравнения строк или чисел или проверки свойств файлов (например, существует ли файл или он доступен для записи) используйте test, как

if test "$fish" = "flounder"
    echo FLOUNDER
end

# or

if test "$number" -gt 5
    echo $number is greater than five
else
    echo $number is five or less
end

# or

# This test is true if the path /etc/hosts exists
# - it could be a file or directory or symlink (or possibly something else).
if test -e /etc/hosts
    echo We most likely have a hosts file
else
    echo We do not have a hosts file
end

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

if command -sq fish; and grep fish /etc/shells
    echo fish is installed and configured
end

Для ещё более сложных условий используйте begin и end для группировки частей условий.

Также существует команда switch:

switch (uname)
case Linux
    echo Hi Tux!
case Darwin
    echo Hi Hexley!
case FreeBSD NetBSD DragonFly
    echo Hi Beastie!
case '*'
    echo Hi, stranger!
end

Как вы видите, case не пропускает и может принимать несколько аргументов или (цитируемые) шаблоны.

Для более подробной информации см. Условные операторы.

Функции

Функция fish — это список команд, которые могут принимать аргументы. В отличие от других оболочек, аргументы не передаются в «переменные с номерами», например, $1, а вместо этого в один список $argv. Чтобы создать функцию, используйте встроенную команду function:

function say_hello
    echo Hello $argv
end
say_hello
# prints: Hello
say_hello everybody!
# prints: Hello everybody!

В отличие от других оболочек, fish не имеет псевдонимов или специального синтаксиса командной строки. Функции занимают их место. [2]

Вы можете вывести список имён всех функций с помощью встроенной команды functions (обратите внимание на множественное число!). Fish изначально имеет несколько функций:

> functions
N_, abbr, alias, bg, cd, cdh, contains_seq, dirh, dirs, disown, down-or-search, edit_command_buffer, export, fg, fish_add_path, fish_breakpoint_prompt, fish_clipboard_copy, fish_clipboard_paste, fish_config, fish_default_key_bindings, fish_default_mode_prompt, fish_git_prompt, fish_hg_prompt, fish_hybrid_key_bindings, fish_indent, fish_is_root_user, fish_job_summary, fish_key_reader, fish_md5, fish_mode_prompt, fish_npm_helper, fish_opt, fish_print_git_action, fish_print_hg_root, fish_prompt, fish_sigtrap_handler, fish_svn_prompt, fish_title, fish_update_completions, fish_vcs_prompt, fish_vi_cursor, fish_vi_key_bindings, funced, funcsave, grep, help, history, hostname, isatty, kill, la, ll, ls, man, nextd, open, popd, prevd, prompt_hostname, prompt_pwd, psub, pushd, realpath, seq, setenv, suspend, trap, type, umask, up-or-search, vared, wait

Вы можете увидеть исходный код любой функции, передав её имя в functions:

> functions ls
function ls --description 'List contents of directory'
    command ls -G $argv
end

Для более подробной информации см. Функции.

[2]

Существует функция под названием alias, но она просто сокращение для создания функций. Fish также предоставляет сокращения через команду abbr.

Циклы

Циклы while:

while true
    echo "Loop forever"
end
# Prints:
# Loop forever
# Loop forever
# Loop forever
# yes, this really will loop forever. Unless you abort it with ctrl-c.

Циклы for могут использоваться для итерации по списку. Например, список файлов:

for file in *.txt
    cp $file $file.bak
end

Итерация по списку чисел может быть выполнена с помощью seq:

for x in (seq 5)
    touch file_$x.txt
end

Для более подробной информации см. Циклы и блоки.

Строка приглашения

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

Вы можете определить свою собственную строку приглашения из командной строки:

> function fish_prompt; echo "New Prompt % "; end
New Prompt % _

Затем, если вы довольны, вы можете сохранить её на диск, набрав funcsave fish_prompt. Это сохраняет строку приглашения в ~/.config/fish/functions/fish_prompt.fish. (Или, если хотите, вы можете создать этот файл вручную с самого начала.)

Несколько строк — нормально. Цвета можно задать через set_color, передав ей имена ANSI цветов или значения RGB в шестнадцатеричном формате:

function fish_prompt
    set_color purple
    date "+%m/%d/%y"
    set_color F00
    echo (pwd) '>' (set_color normal)
end

Эта строка приглашения будет выглядеть так:

02/06/13
/home/tutorial > _

Вы можете выбрать среди некоторых образцов строк приглашения, выполнив fish_config для веб-интерфейса или fish_config prompt для более простой версии внутри вашего терминала.

$PATH

$PATH — это переменная среды, содержащая каталоги, в которых fish ищет команды. В отличие от других оболочек, $PATH — это список, а не строка, разделенная двоеточиями.

Fish позаботится о том, чтобы установить $PATH по умолчанию, но обычно он просто наследуется от родительского процесса fish и устанавливается в значение, которое имеет смысл для системы — см. Экспорт.

Чтобы добавить /usr/local/bin и /usr/sbin в $PATH, можно написать:

> set PATH /usr/local/bin /usr/sbin $PATH

Чтобы удалить /usr/local/bin из $PATH, можно написать:

> set PATH (string match -v /usr/local/bin $PATH)

Для совместимости с другими оболочками и внешними командами $PATH — это переменная пути, и поэтому будет объединена двоеточиями (а не пробелами), когда вы её укажете:

> echo "$PATH"
/usr/local/sbin:/usr/local/bin:/usr/bin

и она будет экспортирована таким образом, и при запуске fish разделит полученный $PATH на список по двоеточиям.

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

Более быстрый способ — использовать функцию fish_add_path, которая добавляет указанные каталоги в путь, если они ещё не включены. Она делает это, изменяя $fish_user_paths универсальную переменную, которая автоматически добавляется в $PATH. Например, чтобы навсегда добавить /usr/local/bin в ваш $PATH, вы могли бы написать:

> fish_add_path /usr/local/bin

Преимущества заключаются в том, что вам не придётся возиться с файлами: достаточно один раз запустить эту команду в командной строке, и она повлияет на текущую сессию и все будущие экземпляры. Вы также можете добавить эту строку в config.fish, так как она добавляет компонент только при необходимости.

Или вы можете изменить $fish_user_paths самостоятельно, но будьте осторожны, не добавляйте к нему безусловно в config.fish, иначе он будет всё расти и расти.

Запуск (Где .bashrc?)

Fish начинает с выполнения команд в ~/.config/fish/config.fish. Вы можете создать её, если она не существует.

Возможно, непосредственно создавать функции и переменные в файле config.fish, используя команды, показанные выше. Например:

> cat ~/.config/fish/config.fish

set -x PATH $PATH /sbin/

function ll
    ls -lh $argv
end

Однако, более распространено и эффективно использовать функции автозагрузки и универсальные переменные.

Если вы хотите организовать свою конфигурацию, fish также читает команды в файлах .fish в ~/.config/fish/conf.d/. См. Файлы конфигурации для подробностей.

Функции автозагрузки

Когда fish встречает команду, она пытается загрузить функцию для этой команды, поиска файла с именем этой команды в ~/.config/fish/functions/.

Например, если вы хотели иметь функцию ll, вы добавили бы текстовый файл ll.fish в ~/.config/fish/functions:

> cat ~/.config/fish/functions/ll.fish
function ll
    ls -lh $argv
end

Это предпочтительный способ определения вашего приглашения:

> cat ~/.config/fish/functions/fish_prompt.fish
function fish_prompt
    echo (pwd) "> "
end

См. документацию для funced и funcsave о способах автоматического создания этих файлов, и $fish_function_path для управления их расположением.

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

Универсальная переменная — это переменная, значение которой разделяется между всеми экземплярами fish, сейчас и в будущем — даже после перезагрузки. Вы можете сделать переменную универсальной с помощью set -U:

> set -U EDITOR vim

Теперь в другой оболочке:

> echo $EDITOR
vim

Готовы к новым знаниям?

Если вы хотите узнать больше о fish, есть много подробной документации, официальный канал gitter, официальный список рассылки и страница github.

© 2005-2009 Axel Liljencrantz, 2009-2023 fish-shell contributors
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.6/tutorial.html

Spec-Zone.ru

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