- Подписка на печатную версию:
- Подписка на электронную версию:
- Подшивки старых номеров журнала (печатные версии)
LXF123:Fish
Материал из Linuxformat.
Содержание |
Fish: Обитатель темных глубин
Дружественный командный интерпретатор Fish обычно теряется в тени гигантов Bash и Zsh, и многие считают его просто игрушкой для новичков. Так ли это, разбирается Евгений Зобнин.
Прошли те времена, когда Linux пользовались только матерые программисты и технически подкованные специалисты. Сегодняшний пользователь Linux – это обычно перебежчик с Windows, человек, пожелавший получить свободу выбора и комфорт. Он может ничего не понимать в драйверах, командной строке и протоколах TCP/IP, ему просто нужна операционная система, которая не будет навязывать свои условия и думать, что она умнее его.
И вот, освоившись в новой для себя среде, пользователь начинает задумываться о более производительных приемах работы и все чаще поглядывает в сторону незамысловатой программы «Терминал», в небольшом безликом окошке которой скрыта настоящая мощь Unix-систем – командный интерпретатор.
Блеск и нищета терминала
Интерпретатор команд(в просторечии «шелл» или «оболочка») всегда был инструментом профессионалов – людей, понимающих тонкости устройства Unix-подобных операционных систем и способных использовать их возможности для достижения нужных результатов. Для новичка же работа в терминале сродни прогулке в густом неизведанном лесу в ночное время суток: непонятно, к чему приведет следующий шаг и куда в конце концов попадешь.
Решить проблемы новичков, впервые увидевших командный интерпретатор, пытались многие программисты. Одни объединяли идеи графических интерфейсов и командного окна, другие создавали многочисленные обертки для команд, призванные облегчить их использование, но только Аксель Лильенкранц [Axel Liljencrantz], решившийся переосмыслить самую суть командного интерпретатора, смог дать пользователям действительно удобный и простой в освоении инструмент.
Почем рыба?
Вышедший из под пера Лильенкранца командный интерпретатор Fish (Friendly Interactive SHell – Дружественная интерактивная оболочка), дословный перевод названия которого означает не что иное как «рыба», вобрал в себя все лучшее от своих предшественников, не унаследовав, однако, анахронизмов и неправильных и сложных, по мнению автора, черт.
Fish (http://www.fishshell.org) принято считать инструментом новичков, идеальным перевалочным пунктом на пути к более сложным Bash и Zsh. На самом деле это не совсем так: простота использования Fish заключена не в «рюшечках» или помощниках, просто «прикрученных сбоку», как это сделано в других «дружелюбных оболочках», и даже не в чрезмерном его упрощении, а в наглядности и логичности. Возможности Fish отнюдь не уступают повсеместно распространенному Bash, что не мешает ему быть гораздо более простым и наглядным в использовании.
Вот неполный список тех особенностей, которые делают Fish действительно удобным и простым:
- Подсветка синтаксиса.
- Расширенный механизм автодополнений, который, кроме возможных вариантов, выводит на экран массу полезной информации.
- Переработанный командный язык, более простой и ясный.
- Информативные сообщения об ошибках, в которых объясняется, как пользователь может исправить ситуацию.
- Встроенная команда help для отображения справки в окне браузера.
- Команда open, открывающая файл в приложении по умолчанию.
- Возможность перехода к другому каталогу без использования команды cd.
- Умный механизм перемещения по каталогам.
Просто попробуйте
Пользователи Vim и других развитых текстовых редакторов привыкли к подсветке синтаксиса языков программирования. Она улучшает читаемость кода, выделяя важные части и затемняя несущественные. Fish использует схожую идею, добавляя к ней щепотку интерактивности. Например, запустите Fish (предварительно, разумеется, установив его через менеджер пакетов) и наберите команду grap:
$ fish $ grap
Как видите, она отобразилась в красном цвете. Это отнюдь не особое чувство стиля создателя Fish, а сигнал, призванный известить пользователя о неправильно набранной команде. Исправьте имя на grep, и вы увидите, что цвет изменился на зеленый.
Теперь введите команду ls, но не запускайте ее на исполнение, а нажмите клавишу Tab. Чувствуете разницу? Автодополнение гораздо более многословно, чем в Bash или Zsh. Список возможных вариантов не только подсвечивается, но и включает в себя краткое описание. Добавьте к введенной команде пробел и вновь нажмите Tab. Вуаля – список файлов включает имена, типы и размеры. Укажите после пробела знак ‘-’, и снова Tab. Это перечень ключей, которые принимает команда, с кратким описанием каждого из них (встроенная функциональность, для получения которой в Bash придется устанавливать пакет bash-completition).
Чувствуете, как скрупулезно Fish обрабатывает информацию перед выводом на экран? Но это далеко не все. Командный интерпретатор подчеркивает правильные пути к файлам, оставляя неизменными ошибочные, а регулярные выражения выделяет синим цветом. Нажатие Tab после команды man приводит к выводу списка разделов man с описанием; краткая информация выводится также и для каждой man-страницы. Автодополнение действует даже на строки, содержащие символы сопоставления с образцом, такие как * и ?. Командный интерпретатор будет применять программу-пейджер (less или то, что указано в переменной $PAGER) каждый раз, когда выводимый список не умещается на экран.
Перейдите на несколько уровней директорий ниже – и вы заметите, как Fish сокращает длинный путь к текущему каталогу за счет усечения имен предыдущих. Наберите команду prevd, и вы попадете туда, где были до выполнения команды cd. Все посещенные вами каталоги сохраняются в стеке, так что вы можете использовать команды prevd и nextd для навигации по ним. Просто попробуйте, и все поймете (подобный механизм есть и в других интерпретаторах; правда, реализуется он с помощью команд pushd и popd и не распространяется на команду cd). Вы вольны не использовать команду cd вообще, набирая просто имена каталогов.
Полезные мелочи
Как и в других командных интерпретаторах, клавиши Вверх и Вниз служат для навигации по истории. Но Fish идет еще дальше: он удаляет из истории все дублирующиеся команды и позволяет производить поиск по первым символам. Просто наберите l и нажмите клавишу Вверх. Скорее всего, вы увидите команду ls (справедливости ради следует сказать, что Zsh в этом плане ничуть не менее удобен, но требует дополнительной настройки для включения нужной функциональности).
Не помните, какой программой следует открывать определенный тип файлов? Доверьте выбор Fish, набрав что-то вроде open file.djvu, и он найдет нужную программу в базе MIME-типов (используемой, в частности, средами Gnome и KDE) и запустит ее на исполнение. А для копирования и вырезания строк в буфер обмена X Window используйте сочетания клавиш Ctrl+Y и Ctrl+K.
Командный интерпретатор поставляется с отличной документацией, для навигации по которой следует использовать команду help. Она автоматически открывает локальную копию справочника в web-браузере по умолчанию. Для доступа к нужной секции просто напишите ее имя в качестве аргумента (например, help alias или help syntax). Заметьте, что автодополнение сработает и в этом случае.
Легкий скриптинг
Как уже отмечалось, интерпретатор Fish включает переработанный командный язык, который стал гораздо более наглядным и простым в освоении. Просто сравните два скрипта:
ejectcd() { cdrom=”/cdrom” lsof $cdrom if [ $? -ne 0 ]; then eject $cdrom fi }
и
function ejectcd set cdrom “/cdrom” lsof $cdrom if [ $? -ne 0 ] eject $cdrom end end
Первый написан на командном языке POSIX sh, который используется в любой современной Unix-оболочке, второй – на языке Fish. Давайте сравним основные управляющие структуры этих языков:
POSIX
- Условный оператор: if true; then echo hello; fi
- Цикл: for i in a b c; do echo $i; done
- Case-оператор: case $you in *) echo hi;; esac
- Функция: hi () { echo hello; }
FISH
- Условный оператор: if true; echo hello; end
- Цикл: for i in a b c; echo $i; end
- Case-оператор: switch $you; case ‘*’; echo hi; end
- Функция: function hi; echo hello; end
Чувствуете разницу? Никаких if...fi, do...done, непонятных скобок в объявлении функции – все просто, логично и единообразно. Командный язык Fish очень логичен и чист; это касается не только ключевых слов, операторов и структур управления, но и, например, способа перенаправления вывода:
bash$ ls >список_файлов.txt 2>ошибки.txt
в Bash и
fish$ ls >список_файлов.txt ^ошибки.txt
Это идентичные команды, перенаправлющие вывод ls в файл список_файлов.txt, а ошибки – в ошибки.txt. Первая правильно отработает в Bash и Zsh, вторая – в Fish.
Для подстановки вывода команд используется единственная форма (команда) вместо двух различных вариантов (`команда` и $(команда)) в POSIX sh. Переменные устанавливаются и удаляются с помощью команды set, запуск которой без аргументов приводит к распечатке всех существующих переменных и их значений. Аналогичные команды существуют и для определения и получения списка функций.
Интересная особенность командного языка Fish – наличие так называемых «универсальных переменных», определяемых с помощью команды
set -U переменная значение
Универсальные переменные становятся видны всем экземплярам Fish, работающим на данном ПК, и позволяют обмениваться информацией между оболочками.
Ну как, понравилось?
Вопреки расхожему мнению, Fish – не игрушка, а мощный, удобный и лишенный противоречий командный интерпретатор. Он прост, но функционален; логичен и не примитивен. В отличие от своих предшественников, Fish не обременен тяжелым грузом функциональности, что не мешает ему быть более удобным и эффективным в использовании. И если вы готовы платить за все его удобства несовместимостью синтаксиса (а это подразумевает невозможность выполнять стандартные сценарии оболочки, если у вас отсутствует Bash или аналогичный интерпретатор) – вперед: устанавливайте, пробуйте, познавайте. LXF