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