4 интересные и необычные оболочки для Linux

4 интересные и необычные оболочки для Linux


Перейти по ссылкам

  • fish: Дружелюбная интерактивная оболочка
  • Murex: Интуитивный и Осведомлённый о Контенте
  • Nushell: новый тип оболочки
  • PowerShell: оболочка Windows теперь для всех

Как пользователь Linux, вы, вероятно, выполняете команды в своем терминале, используя один из двух шеллов: bash или zsh. Возможно, вы слышали о их предшественниках, таких как sh или csh; может быть, вы даже знаете о более новых шеллах, таких как fish. Но как насчет этих современных альтернатив: могут ли они действительно повлиять на вашу повседневную работу?

fish: Дружелюбная Интерактивная Оболочка

Оболочка fish является одной из наиболее известных современных альтернатив любой оболочке, используемой по умолчанию в вашей дистрибутиве. Она делает акцент на удобстве для пользователя, предлагая мощное автодополнение, подсветку синтаксиса и рекомендации команд.

Fish доступен для Linux и macOS, поэтому начать его использовать может быть так же просто, как выполнить brew install fish или apt-get install fish.

Если вы знакомы с отличным автодополнением zsh с помощью клавиши Tab, fish заставит вас чувствовать себя как дома. Начните вводить команду, и fish предложит завершение, серым цветом, после введённых вами символов:

Это предлагаемое завершение основано на вашей истории команд и допустимых путях к файлам, поэтому оно часто очень полезно. Введите больше букв, и fish уточнит своё предложение. Вы можете принять предложение, нажав клавишу Вправо, а нажатие Tab покажет набор вариантов, между которыми можно перемещаться с помощью клавиш курсора:

Если вы показываете предложения для самой команды, вы увидите все соответствующие команды с информацией о том, что делает каждая из них:

Вы также можете использовать функцию автоподсказки, чтобы просмотреть доступные варианты, нажав Tab после одного символа -:

fish обладает высокой настраиваемостью, но часто использует другой подход по сравнению с более популярными оболочками, такими как Bash и Zsh. Например, настройка приглашения командной строки — это одно из первых навыков, которое вы освоите при работе с терминалом, но fish по умолчанию поставляется с довольно уникальным приглашением:

Этот prompt сокращает имена каталогов в текущей иерархии до одной буквы и выводит имя ветки, если вы находитесь внутри репозитория git, поэтому он довольно полезен по умолчанию. Но вы также можете изменить prompt с помощью функции fish, набрав следующее в командной строке:

function fish_prompt; echo "% "; end      

Функциональный подход — это значительный шаг вперёд по сравнению с PS1 в Bash, который представляет собой строковую переменную с предопределённым синтаксисом.

Аналогично, хотя fish поддерживает переменную PATH так же, как и другие оболочки, на самом деле она представляет собой переменную-список, а не строку. Это упрощает её модификацию с помощью вспомогательной функции под названием fish_add_path:

fish_add_path ~/myprogs      

Дружелюбный способ настройки fish предоставляется через его веб-интерфейс. Просто выполните fish_config в командной строке, и fish откроет окно браузера с базовым пользовательским интерфейсом, позволяющим изменять различные настройки:

Вам нужно быть осведомленным о различиях между командами в Unix-подобных системах, особенно в отношении общих функций, с которыми вы можете быть знакомы. Например, я часто использую !$ в Bash для повторения последнего аргумента предыдущей команды, например.

ls README.md wc -l !$      

fish не поддерживает те же !$— также оно не поддерживает $0, $? (используется $status), и !!. Вы можете вставить последний аргумент предыдущей команды с помощью Alt + Up, и существуют аналоги для большинства остальных команд, но вам, возможно, придётся привыкнуть к некоторым очень укоренившимся привычкам, чтобы использовать эти альтернативы.

Из-за таких различий fish не соответствует стандарту POSIX, что означает, что его скрипты несовместимы с оболочками, поддерживающими POSIX, такими как Bash и Zsh.

Murex: Интуитивный и Осведомлённый о Контенте

Murex — это довольно новая оболочка (2017), написанная на Go. Эта оболочка имеет встроенную поддержку сложных форматов данных, включая объекты словаря, CSV и JSON. Это означает, что вы можете делать такие вещи, как:

object = %{ color: "red", "size": "large" }      

Приведенный выше код определяет переменную JSON, которую вы можете использовать так же, как структурированный объект в JavaScript:

Чтобы воспользоваться более структурированным подходом, Murex предлагает собственные альтернативы общим командам. Например, встроенная команда f похожа на команду ls; она отображает файлы в текущем каталоге, отфильтрованные с помощью одного из нескольких доступных флагов:

f +f     # show all files f +x -d  # show all executable files that aren't directories       

Однако главное различие здесь в том, что результатом является JSON-массив, а не список строк:

f +s      

Аналогично, команда g выполняет тот же тип операции глоббинга, к которой вы привыкли в Bash:

g *.md      

Вы можете использовать расширенный синтаксис конвейеров Murex для работы со структурированными данными из команд. Традиционные оболочки Unix передают данные через конвейеры в виде строк, но более мощные типы данных Murex требуют особого способа передачи через конвейеры.

Обобщённая трубопроводная операция (=>) очень похожа на классическую трубопроводную операцию (|), но она преобразует вывод в более удобный формат для внешних команд, которые не поддерживают типы данных Murex. Например:

В то время как традиционный конвейер превращает вывод функции f в одну строку, универсальный конвейер форматирует его как список содержимого, по одному элементу на строку, чтобы команда wc могла правильно подсчитать количество элементов.

Эта концепция лучше всего работает с операторами обработки данных Murex. Они позволяют получать доступ к структурированным данным и изменять их, чтобы вы могли передавать вывод одной команды в другую, которая форматирует эти данные или выполняет с ними дальнейшие операции. Вот пример:

config | [[ /shell/syntax-highlighting ]]      

В этой команде синтаксис [[ ]] обращается к вложенному элементу в выводе из конфигурации:

Моя главная претензия к Murex — это его документация или, точнее, её отсутствие. Например, стандартная команда-приглашение — просто «murex», что не очень удобно. Я долго пытался разобраться, как это изменить; как и рыба, Murex не поддерживает стандартную переменную $PS1.

Однако, в отличие от рыб, Murex не может четко объяснить, как изменить свою подсказку. Я обнаружил противоречивую (возможно, устаревшую) информацию о событии onPrompt, которое выглядело как сложный (хотя и мощный) способ настройки подсказки, похожий на функциональный подход fish. Я не смог заставить его работать, но нашел конфигурационную настройку, которая, казалось, делала то, что я хотел:

config: set shell prompt {     exitnum -> !if {         out "{RESET}{YELLOW}${pwd_short} {GREEN}»{RESET} "     } else {         out "{RESET}{YELLOW}${pwd_short} {RED}»{RESET} "     } }      

Это полезный prompt, который не только показывает сокращённую версию текущего пути, но и окрашивает символ » в соответствии с состоянием последней команды. Тем не менее, я не смог найти никакой документации по этому параметру конфигурации; мне пришлось обнаружить этот фрагмент случайно в одном из gist на GitHub.

Nushell: новый тип оболочки

Многие оболочки кажутся схожими на первый взгляд, а их различия ограничиваются низкоуровневыми скриптовыми возможностями или незначительными изменениями синтаксиса. Это не относится к Nushell (Nu), оболочной программе, написанной на Rust и выпущенной в 2019 году. Как только вы выполните свою первую команду в Nu, вы сразу заметите большую разницу:

Это связано с тем, что, как и Murex, Nu поддерживает структурированные данные. Однако Nu идёт дальше, предоставляя собственные аналоги распространённых команд (или встроенных функций), таких как ls. Такой подход может создавать много вывода, хотя табличное форматирование обычно легче воспринимать, чем обычная форма Bash:

Вы также можете использовать Nushell для передачи данных от одной команды к другой, используя его структуру. Например, вы можете очень легко получить и извлечь данные из веб-API, используя две встроенные функции Nushell: http и get:

~/repos/nushell> http get https://speed.cloudflare.com/meta | get region      

Команда get позволяет обрабатывать структурированные данные. В данном случае вы можете использовать эквивалентный сокращённый вариант:

(http get https://speed.cloudflare.com/meta).region      

Стандартное поведение Nushell и его понятный, современный интерфейс делают его отличным выбором для оболочки следующего поколения. Он хорошо документирован, прост в использовании и обычно работает так, как вы ожидаете.

У меня есть всего пара претензий к Nushell. Первая довольно тривиальна, учитывая современные цены на хранение данных, но это довольно большой шелл по сравнению с альтернативами: 39 МБ. Для сравнения, zsh занимает всего 1,3 МБ.

Я также заметил странное поведение команды ls -d. Это затратный по времени вызов, потому что он действует немного как du, суммируя общий размер каталогов. Но я видел, что его вывод разделялся на отдельные таблицы по какой-то неизвестной причине, что казалось небольшой ошибкой.

PowerShell: оболочка Windows, теперь для всех

PowerShell — это программа от Microsoft, которая предоставляет пользователям Windows возможности, аналогичные оболочкам Linux. Хотя она тесно интегрирована с операционной системой Windows, теперь доступна версия для пользователей Linux и Mac, чтобы попробовать её; на самом деле, она существует с 2016 года.

Вы можете установить PowerShell на Mac с помощью Homebrew (brew install —cask powershell) и на Linux, следуя инструкциям для вашей конкретной дистрибуции. После установки запустите его с помощью команды pwsh.

PowerShell приносит с собой знакомые команды MS-DOS, такие как dir:

Сочетайте это с таким инструментом, как Microsoft Edit для Mac и Linux, и вы почти сможете убедить себя, что работаете в MS-DOS, если захотите.

Поскольку PowerShell реализован так же, как и другая оболочка, у вас всё равно будет доступ к знакомым командам Unix, поэтому вы можете игнорировать эквиваленты DOS, если хотите.

Истинная ценность PowerShell заключается в том, что, как и Murex и Nushell, он обладает мощной моделью данных, которая работает с объектами, а не со строками. Это особенно заметно при последовательном выполнении команд в конвейере:

Get-ChildItem -Path repos/ov | Select-Object -Property Size      

Здесь Get-ChildItem и Select-Object являются Cmdlet’ами — встроенными командами, которые выполняют небольшие задачи, обычно внутри конвейера. Cmdlet’ы написаны на языках .NET, а PowerShell включает API, который Cmdlet’ы могут использовать для выполнения низкоуровневых задач.

PowerShell действительно кажется взрывом из прошлого для тех из нас, кто помнит, как использовал DOS сорок лет назад. Но я на самом деле не скучаю по этому опыту; в конце концов, есть причины, по которым я перешёл на Linux и macOS. Эта оболочка останется для меня интересной курьезностью, но она наверняка будет более полезной, если вы используете и Windows, и Linux.


Альтернативные оболочки, похоже, находятся на грани прорыва, но пока не способны свергнуть гиганта по имени Bash. Большинство из нас останется на стандартной оболочке, но приятно иметь варианты, особенно когда они предлагают такие уникальные и мощные функции, как эти оболочки. В конечном счете, однако, я думаю, что они останутся нишевыми, пока полностью не примут стандарты POSIX.

Комментарии

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *