Spec-Zone.ru › Fish 2.3

Учебник по 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

Если эта навигация по каталогам занимает много времени, вы можете прервать её нажатием Control-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

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

> rsync -avze ssh . myname@somelonghost.com:/some/long/path/doo/dee/doo/dee/doo

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

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

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

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

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

Если есть несколько вариантов, он выведет их:

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

Нажмите клавишу табу еще раз, чтобы перейти к другим вариантам.

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)

Попробуйте нажать клавишу табу и посмотреть, что 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
MyVariable=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

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

Получите длину списка с помощью 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.3/tutorial.html

Spec-Zone.ru

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