Spec-Zone.ru › Fish 2.4

Учебник по fish

Почему fish?

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

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

Изучение fish

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

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

При запуске 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

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

> <eror>r<</eror>\@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:

> 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

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

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

Spec-Zone.ru

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