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