Нушелл — это новый тип оболочки. Цель 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 для использования по своему усмотрению.