Spec-Zone.ru › Fish 3.4

Учебник

Почему 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...

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

Вы быстро заметите, что 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 в один файл, сначала необходимо перенаправить stdout, а затем stderr в stdout:

> make > make_output.txt 2>&1

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

Автопредложения

По мере ввода 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  (Executable, 4.8kB)  ~/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 нет специального синтаксиса VARIABLE=VALUE для задания переменных. Вместо этого есть обычная команда 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. Вы заметите, что они написаны с использованием ЗАГЛАВНЫХ букв, но это всего лишь соглашение.

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

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

Списки

Команда 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 не разделяет подстановки команд по любым пробелам (таким как пробелы или табуляции), только по символам новой строки. Это может быть проблемой с командами, такими как 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

Код завершения

При завершении команды она возвращает код состояния как целое неотрицательное число.

В отличие от других оболочек, 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 для условного выполнения кода на основе кода завершения команды.

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 grep fish /etc/shells; and command -sq fish
    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, но она просто сокращение для создания функций.

Циклы

Циклы 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.

© 2022 fish-shell developers
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/3.4/tutorial.html

Spec-Zone.ru

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