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