Нушелл — это новый тип оболочки. Цель Nushell — взять философию оболочек Unix, где конвейеры соединяют вместе простые команды, и привести ее к современному стилю разработки. Таким образом, вместо того, чтобы быть оболочкой или языком программирования, Nushell соединяет и то, и другое, объединяя богатый язык программирования и полнофункциональную оболочку в одном пакете.
Stars: 23.2k License: MIT Languages: Rust(99.2%) Link: https://github.com/nushell/nushell
Nu берет пример со многих знакомых территорий: традиционных оболочек, таких как bash, объектно-ориентированных оболочек, таких как PowerShell, постепенно типизированных языков, таких как TypeScript, функционального программирования, системного программирования и т. д. Но вместо того, чтобы пытаться быть мастером на все руки, Nu сосредотачивает свою энергию на том, чтобы хорошо делать несколько вещей:
- Это гибкая кроссплатформенная оболочка с современным интерфейсом. Nu работает на Linux, macOS, BSD и Windows. Изучите его один раз, а затем используйте его где угодно.
- Решение проблем как современный язык программирования, который работает со структурой ваших данных.
- Предоставление четких сообщений об ошибках и чистой поддержки IDE
Философия
Nu черпает вдохновение в таких проектах, как PowerShell, функциональных языках программирования и современных инструментах CLI. Вместо того, чтобы думать о файлах и данных как о необработанных потоках текста, Nu рассматривает каждый ввод как что-то со структурой. Например, когда вы перечисляете содержимое каталога, вы получаете таблицу строк, где каждая строка представляет элемент в этом каталоге. Эти значения могут быть переданы через серию шагов в серии команд, называемых «конвейером».
Трубопроводы
В Unix обычно используется конвейер между командами, чтобы разделить сложную команду на несколько шагов. Nu делает еще один шаг вперед и в значительной степени основывается на идее конвейеров. Как и в философии Unix, Nu позволяет командам выводить данные на стандартный вывод и читать их со стандартного ввода. Кроме того, команды могут выводить структурированные данные (вы можете думать об этом как о третьем виде потока). Команды, работающие в конвейере, относятся к одной из трех категорий:
- Команды, создающие поток (например,
ls
) - Команды, фильтрующие поток (например,
where type == "dir"
) - Команды, использующие выходные данные конвейера (например,
table
)
Команды разделены символом трубы (|
), чтобы обозначить конвейер, проходящий слева направо.
> ls | where type == "dir" | table ╭────┬──────────┬──────┬─────────┬───────────────╮ │ # │ name │ type │ size │ modified │ ├────┼──────────┼──────┼─────────┼───────────────┤ │ 0 │ .cargo │ dir │ 0 B │ 9 minutes ago │ │ 1 │ assets │ dir │ 0 B │ 2 weeks ago │ │ 2 │ crates │ dir │ 4.0 KiB │ 2 weeks ago │ │ 3 │ docker │ dir │ 0 B │ 2 weeks ago │ │ 4 │ docs │ dir │ 0 B │ 2 weeks ago │ │ 5 │ images │ dir │ 0 B │ 2 weeks ago │ │ 6 │ pkg_mgrs │ dir │ 0 B │ 2 weeks ago │ │ 7 │ samples │ dir │ 0 B │ 2 weeks ago │ │ 8 │ src │ dir │ 4.0 KiB │ 2 weeks ago │ │ 9 │ target │ dir │ 0 B │ a day ago │ │ 10 │ tests │ dir │ 4.0 KiB │ 2 weeks ago │ │ 11 │ wix │ dir │ 0 B │ 2 weeks ago │ ╰────┴──────────┴──────┴─────────┴───────────────╯
Поскольку большую часть времени вам нужно будет видеть вывод конвейера, предполагается table
. Мы могли бы также написать выше:
> ls | where type == "dir"
Возможность использовать одни и те же команды и составлять их по-разному — важная философия Nu. Например, мы могли бы использовать встроенную команду ps
для получения списка запущенных процессов, используя ту же команду where
, что и выше.
> ps | where cpu > 0 ╭───┬───────┬───────────┬───────┬───────────┬───────────╮ │ # │ pid │ name │ cpu │ mem │ virtual │ ├───┼───────┼───────────┼───────┼───────────┼───────────┤ │ 0 │ 2240 │ Slack.exe │ 16.40 │ 178.3 MiB │ 232.6 MiB │ │ 1 │ 16948 │ Slack.exe │ 16.32 │ 205.0 MiB │ 197.9 MiB │ │ 2 │ 17700 │ nu.exe │ 3.77 │ 26.1 MiB │ 8.8 MiB │ ╰───┴───────┴───────────┴───────┴───────────┴───────────╯
Открытие файлов
Nu может загружать содержимое файла и URL-адреса в виде необработанного текста или структурированных данных (если он распознает формат). Например, вы можете загрузить файл .toml как структурированные данные и изучить его:
> open Cargo.toml ╭──────────────────┬────────────────────╮ │ bin │ [table 1 row] │ │ dependencies │ {record 25 fields} │ │ dev-dependencies │ {record 8 fields} │ │ features │ {record 10 fields} │ │ package │ {record 13 fields} │ │ patch │ {record 1 field} │ │ profile │ {record 3 fields} │ │ target │ {record 3 fields} │ │ workspace │ {record 1 field} │ ╰──────────────────┴────────────────────╯
Мы можем передать это в команду, которая получает содержимое одного из столбцов:
> open Cargo.toml | get package ╭───────────────┬────────────────────────────────────╮ │ authors │ [list 1 item] │ │ default-run │ nu │ │ description │ A new type of shell │ │ documentation │ https://www.nushell.sh/book/ │ │ edition │ 2018 │ │ exclude │ [list 1 item] │ │ homepage │ https://www.nushell.sh │ │ license │ MIT │ │ metadata │ {record 1 field} │ │ name │ nu │ │ repository │ https://github.com/nushell/nushell │ │ rust-version │ 1.60 │ │ version │ 0.72.0 │ ╰───────────────┴────────────────────────────────────╯
И при необходимости мы можем углубиться дальше:
> open Cargo.toml | get package.version 0.72.0
Плагины
Nu поддерживает плагины, которые предлагают дополнительные функции для оболочки и следуют той же модели структурированных данных, что и встроенные команды. В каталогах crates/nu_plugins_*
есть несколько примеров.
Плагины — это двоичные файлы, которые доступны по вашему пути и соответствуют соглашению об именах nu_plugin_*
. Эти двоичные файлы взаимодействуют с nu через простой протокол JSON-RPC, где команда идентифицирует себя и передает свою конфигурацию, делая ее доступной для использования. Если плагин является фильтром, данные передаются ему по одному элементу за раз, а в ответ он может передавать данные обратно через stdin/stdout. Если плагин является приемником, ему предоставляется полный вектор окончательных данных и предоставляется свобода действий над stdin/stdout для использования по своему усмотрению.