Spec-Zone.ru › Fish 2.6

Учебник по fish

Почему fish?

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

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

Изучение fish

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

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

При запуске fish, вы должны увидеть следующее:

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

fish поставляется с предопределённым приглашением, которое отображает ваше имя пользователя, имя хоста и текущую рабочую директорию. Вы узнаете как изменить своё приглашение далее. Отныне мы будем использовать '>' для экономии места.

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

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

> echo hello world
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

Если эта операция обхода директорий занимает много времени, вы можете прервать её с помощью Ctrl-C.

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

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

> echo hello world | wc
       1       2      12

stdin и stdout можно перенаправлять с помощью знакомых < и >. В отличие от других оболочек, stderr перенаправляется с использованием знака ^

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

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

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

> /bin/hostname

Он знает пути и опции:

> grep --ignore-case

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

> r<\@args{ync} \ ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo}

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

Автодополнение с помощью клавиши Tab

fish поставляется с богатым набором автодополнения, которое работает «из коробки».

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

> /pri @key{Tab} → /private/

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

> ~/stuff/s @key{Tab}
~/stuff/script.sh  (Executable, 4.8kB)  ~/stuff/sources/  (Directory)

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

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

> git merge pr @key{Tab} → git merge prompt_designer
> git checkout b @key{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, со всеми пробелами. Другие оболочки используют термин «массивы» вместо списков.

Код выхода

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

> false
> echo $status
1

Ноль считается успехом, а ненулевое значение — неудачей.

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

В отличие от других оболочек, fish не имеет команды export. Вместо этого переменная экспортируется с помощью опции к set, либо --export или просто -x.

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

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

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

Списки

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

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

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

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

Обратите внимание, что три переменные окружения автоматически разбиваются на списки по двоеточиям при запуске fish: PATH, CDPATH, MANPATH. И наоборот, они объединяются по двоеточиям при экспорте в подкоманды. Все остальные переменные окружения (например, LD_LIBRARY_PATH), которые имеют аналогичную семантику, обрабатываются как простые строки.

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

Получить длину списка можно с помощью 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 -l a 1 2 3
> set -l 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 не имеет специального синтаксиса, такого как && или || для объединения команд. Вместо этого она имеет команды and, or, и not.

> cp file1.txt file1_bak.txt; and echo "Backup successful"; or echo "Backup failed"
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

Также есть команда 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
...

Циклы 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
02/06/13
/home/tutorial > 

Вы можете выбрать одну из образцовых подсказок, выполнив 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

Вы можете сделать это непосредственно в 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 сталкивается с командой, она пытается загрузить функцию для этой команды, поискав файл с именем этой команды в ~/.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, в настоящее время и в будущем — даже после перезагрузки. Сделать переменную универсальной можно с помощью set -U:

> set -U EDITOR vim

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

> echo $EDITOR
vim

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

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

© 2005–2009 Axel Liljencrantz
Licensed under the GNU General Public License, version 2.
https://fishshell.com/docs/2.6/tutorial.html

Spec-Zone.ru

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