Spec-Zone.ru › Fish 2.5

Руководство по 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.5/tutorial.html

Spec-Zone.ru

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