Spec-Zone.ru › Fish 3.1

Руководство

Почему рыба?

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

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

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

> echo hello world
hello world

Это выполняет команду echo с аргументами hello и world.

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

> mkdir My\ Files
> cp ~/Some\ File 'My Files'
> ls "My Files"
Some File

Команды можно объединять с помощью точки с запятой.

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

fish имеет отличные справки и страницы man. Запустите help чтобы открыть справку в веб-браузере, и man чтобы открыть её в страницах man. Вы также можете запросить справку по конкретной команде, например help set чтобы открыть в веб-браузере, или man set чтобы увидеть её в терминале.

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

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

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

> /bin/mkd

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

> /bin/mkdir

fish будет подчёркивать корректные пути к файлам по мере их ввода.

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

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

fish поставляется с богатым набором функций автодополнения, которые работают "из коробки".

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

> /pri Tab => /private/

Если существует несколько вариантов, они будут перечислены.

> ~/stuff/s Tab ~/stuff/script.sh (Исполняемый файл, 4.8 КБ) ~/stuff/sources/ (Директория)

Нажмите Tab ещё раз, чтобы переключиться на другие варианты.

fish также может дополнить многие команды, такие как ветви git:

> git merge pr :kbd:`Tab` => git merge prompt_designer
> git checkout b :kbd:`Tab`
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. Вы заметите, что они написаны заглавными буквами, но это просто соглашение.

Чтобы передать переменную внешней команде, её необходимо «экспортировать». В отличие от других оболочек, fish не имеет команды экспорта. Вместо этого переменная экспортируется через опцию к set, либо --export или просто -x.

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

Её также можно убрать с помощью --unexport или -u.

Списки

Команда 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 " ")
-lgio-2.0
-lgobject-2.0
-lglib-2.0

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

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

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

echo fish; echo chips

# or
echo fish
echo chips

Код выхода

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

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

> false
> echo $status
1

Это указывает, как прошла команда — 0 обычно означает успех, в то время как другие значения обозначают разные типы ошибок. Например, set --query оболочки fish возвращает количество переменных, которые были запрошены, но не установлены — 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.txt file1_bak.txt && cp file2.txt file2_bak.txt ; and echo "Backup successful"; or echo "Backup failed"
Backup failed

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

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

Условные операторы (Если, Иначе, Переключатель)

Используйте if, else 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

if test -e /etc/hosts # is true if the path /etc/hosts exists - it could be a file or directory or symlink (or possibly something else).
    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
Hello
> say_hello everybody!
Hello everybody!

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

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

> functions
alias, cd, delete-or-exit, dirh, dirs, down-or-search, eval, export, fish_command_not_found_setup, fish_config, fish_default_key_bindings, fish_prompt, fish_right_prompt, fish_sigtrap_handler, fish_update_completions, funced, funcsave, grep, help, history, isatty, ls, man, math, nextd, nextd-or-forward-word, open, popd, prevd, prevd-or-backward-word, prompt_pwd, psub, pushd, seq, setenv, trap, type, umask, up-or-search, vared

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

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

Циклы

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

Вы можете определить своё собственное приглашение:

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

Разные строки допускаются. Цвета можно установить с помощью set_color, передавая ему имена ANSI-цветов или шестнадцатеричные значения RGB:

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

будет выглядеть так

Вы можете выбрать среди некоторых образцов приглашений, выполнив fish_config prompt. fish также поддерживает RPROMPT через fish_right_prompt.

$PATH

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

Чтобы добавить /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_user_paths универсальную переменную, которая автоматически добавляется к $PATH. Например, чтобы постоянно добавить /usr/local/bin в $PATH, вы могли бы написать:

> set -U fish_user_paths /usr/local/bin $fish_user_paths

Преимущества в том, что вам не нужно копаться в файлах: просто выполните эту команду один раз в командной строке, и она повлияет на текущий сеанс и все будущие сеансы. (Примечание: не нужно добавлять эту строку в config.fish. Если вы это сделаете, переменная будет увеличиваться с каждым запуском 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?

Если вы хотите использовать fish (или любую другую оболочку) в качестве вашей стандартной оболочки, вам нужно указать исполняемый файл новой оболочки /usr/local/bin/fish в двух местах: - добавить /usr/local/bin/fish в /etc/shells - изменить стандартную оболочку с помощью chsh -s /usr/local/bin/fish

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

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

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

Измените стандартную оболочку на fish с помощью:

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

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

Хотите узнать больше?

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

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

Spec-Zone.ru

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