Spec-Zone.ru › Fish 3.3

Учебник

Почему рыбки?

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.

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

Изучение fish

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

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

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

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

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) для её открытия в справочной странице. Вы также можете запросить справку по конкретной команде, например, help set для открытия в веб-браузере или man set для просмотра в терминале.

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

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

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

> /bin/mkd

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

> /bin/mkdir

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

> cat ~/somefi

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

Эти цвета, и многие другие, можно изменить, запустив 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+→ (стрелка вправо). Если автодополнение не то, что вы хотите, просто игнорируйте его.

Автоподстановка

Набор автоподстановок работает «из коробки».

Нажмите 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 нет команды export. Вместо этого переменная экспортируется с помощью параметра к 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
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

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

> echo "first line
second line" > myfile
> set myfile (cat myfile | string collect)
> 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 также поддерживает и, или и не. Первые два являются модификаторами задач и имеют меньший приоритет. Пример использования:

> 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 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 (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
Hello
> say_hello everybody!
Hello everybody!

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

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

> functions
N_, abbr, alias, bg, cd, cdh, contains_seq, delete-or-exit, 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, nextd-or-forward-word, open, popd, prevd, prevd-or-backward-word, 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
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 permanently, вы могли написать:

> fish_add_path /usr/local/bin

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

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

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

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

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

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

set -x PATH $PATH /sbin/

function ll
    ls -lh $argv
end

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

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

Автозагрузка функций

Когда фиш сталкивается с командой, он пытается загрузить функцию для этой команды, найдя файл с именем этой команды в ~/.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 для управления их расположением.

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

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

> set -U EDITOR vim

Теперь в другом терминале:

> echo $EDITOR
vim

Переход на фиш?

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

Добавьте оболочку в /etc/shells с помощью:

> echo /usr/local/bin/fish | sudo tee -a /etc/shells

Измените свою основную оболочку с помощью:

> chsh -s /usr/local/bin/fish

Это предполагает, что вы установили фиш в /usr/local/bin, что является стандартным расположением, когда вы сами его скомпилировали. Если вы установили его с помощью менеджера пакетов, обычное расположение — /usr/bin/fish, но менеджеры пакетов обычно уже добавляют его в /etc/shells. Просто замените правильное расположение.

(Чтобы изменить её обратно на другую оболочку, просто замените /usr/local/bin/fish на /bin/bash, /bin/tcsh или /bin/zsh в шагах выше, соответственно.)

Готовы к следующему шагу?

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

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

Spec-Zone.ru

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