Spec-Zone.ru › Fish 3.7

Руководство

Почему 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 отличается, найдите магическую фразу unlike other shells, которая используется для выделения важных отличий.

Или, если вы хотите краткий обзор различий с другими оболочками, такими как 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)

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

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 fish возвращает количество переменных, которые он запрашивал, но которые не были заданы — set --query PATH обычно возвращает 0, set --query arglbargl boogagoogoo обычно возвращает 2.

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

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

[1]

или «статусы», если хотите, или «статусы» (statūs), если вы путешествуете во времени из Древнего Рима или работаете преподавателем латыни

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

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.7/tutorial.html

Spec-Zone.ru

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