Журнал LinuxFormat - перейти на главную

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, и вы увидите, что цвет изменился на зеленый.

LXF123 30 1.jpg По нажатию на клавишу Tab Fish печатает не только доступные флаги, но и их описание

Теперь введите команду 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). Заметьте, что автодополнение сработает и в этом случае.

LXF123 31 1.jpg Зачем вам ls, если Fish может генерировать такие листинги?

Легкий скриптинг

Как уже отмечалось, интерпретатор 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

Персональные инструменты
купить
подписаться
Яндекс.Метрика