На днях был представлен проект nushell (краткое название — Nu). Он появился благодаря идеям из «философии классических конвейеров в Unix, подхода со структурированными данными из PowerShell, функционального программирования, системного программирования и так далее». На GitHub проект лаконично описан как «современный shell эры GitHub, написанный на Rust».



Авторы проекта, вдохновившись возможностями PowerShell и даже несмотря на свои привычки и любовь к Bash/zsh/fish…, руководствовались следующими мыслями при создании нового проекта:

А что, если мы возьмём идеи структурированного шелла и сделаем его более функциональным (в противовес объектно-ориентированному)? А что, если, как PowerShell, он работал бы в Windows, Linux и macOS? А если, если бы у него были классные сообщения об ошибках?

Результат не заставил себя долго ждать. Исходный код nushell написали на Rust (в проекте активно используются его многочисленные возможности: async/await, async streams, Serde, — а также многочисленные пакеты, т.е. crates) и опубликовали на условиях свободной лицензии MIT. С момента анонса Nu прошло 5 дней, за которые ему удалось собрать уже почти 3000 звёзд на GitHub.

Цели проекта обозначены следующим образом:

  • Кроссплатформенность. Применяемые команды и техники должны переноситься между платформами. Обеспечивается полноценная поддержка операционных систем Windows, macOS и Linux.
  • Совместимость с существующими специфичными для платформ бинарниками, стоящими во главе привычных для многих рабочих процессов (в качестве примеров авторы приводят git и vim).
  • Соответствие актуальных на сегодня ожиданиям по удобству использования командной оболочки.
  • Объектный shell (как PowerShell), предлагающий структурированное и неструктурированное представления данных.
  • Использование конвейеров (как Unix pipelines) для загрузки, изменения и сохранения данных без их фактического изменения.

Среди базовых команд nushell заявлены не нуждающиеся в особых комментариях cd, cp, ls, mkdir, mv, date, ps, rm, exit и другие. Куда интереснее могут оказаться доступные фильтры. Вот некоторые их примеры для структурированных данных (таблиц):

  • pick и reject — выбрать/убрать столбцы для отображения;
  • sort-by — сортировать по столбцам;
  • where — условие для выборки;
  • add — добавить новое поле;
  • sum — суммирования значения в столбце;
  • to-array, from-array — преобразовать строки в массив (список) и наоборот;
  • to-json, to-toml, to-yaml, to-csv — преобразовать таблицу в соответствующий текстовый формат;
  • и другие!

Предусмотрены фильтры и для неструктурированных данных.

Вот, например, как в nushell будет выглядеть отбор файлов размером более 10 килобайт:



… или вывод процессов, нагружающих CPU:



Расширение функциональных возможностей nushell возможно с помощью плагинов, представляемых в виде бинарников, взаимодействующих с Nu через простой протокол JSON-RPC.

Авторы проекта уже работают над созданием книги про свою оболочку на английском и испанском языках.

Быстро попробовать nushell можно в Docker-контейнере:

$ docker build -t nu .
$ docker run -it nu

… а процесс полноценной установки описан здесь.

Комментарии (14)


  1. podivilov
    29.08.2019 18:16

    Спасибо за статью!


  1. mjr27
    29.08.2019 18:46

    Всё-таки не удержусь: чем оно потенциально лучше, чем powershell?


    1. shurup Автор
      30.08.2019 14:01

      Сам не пользуюсь PowerShell, но многие жалуются, что PowerShell слишком сложен/избыточен/медлителен/неудобен для повседневного использования именно в качестве shell'а. Множество таких мнений можно найти в обсуждении анонса nushell на Hacker News:1 (с последующими ответами), 2, 3, …


  1. OnYourLips
    29.08.2019 19:14
    +1

    Похоже на ps с чуть более приятным написанием команд. Но киллерфичи в статье не описаны. Для сравнения


    ls | where size > 10kb
    Get-ChildItem | Where-Object {$_.Length -gt 10KB}


    1. mjr27
      29.08.2019 00:07
      +1

      справедливости ради, в реальном ps это выглядит как


       ls | where -p length -gt 10kb


      1. oji
        01.09.2019 09:38

        Или даже так:
        ls | ? le* -gt 10kb


  1. ziv
    29.08.2019 19:54

    Автодополнения пока не завезли, без них практически не представляю использование шелла.
    github.com/nushell/nushell/issues/290


  1. glowingsword
    28.08.2019 22:14

    На первый взгляд идея выглядит интересно. Но то ли bash меня разбаловал, то ли функционал у данной оболочки пока очень даже небольшой. Не вижу условий, циклов, массивов, возможности запустить что-то в дочерней оболочке и сохранить выхлоп в переменную и т.п. Получается, что скриптовать что-либо на этом чуде не реально. Боюсь, что пройдут годы, пока в него завезут весь необходимый функционал.


    1. saipr
      28.08.2019 23:51
      -2

      А помимо bash, есть еще и tcl, который меня разбаловал -)


      1. glowingsword
        30.08.2019 20:02
        +1

        Tcl использовал всего пару раз. Приятный ЯП. А вообще обычно до него дело не доходило. Хватало и bash с головой, современный bash очень неплох. А там где не хватало — брал сразу ruby/python.


        1. saipr
          30.08.2019 22:05

          Shell — классика. Брал все — и ruby и python и perl и php и т.д, но лучше все же tcl, просто надо хоть раз на нем серьезно поработать.
          За объективность — спасибо.


          1. glowingsword
            30.08.2019 22:43
            +1

            Впечатляет. Вы и графическую морду на Tk к скрипту на Tcl прикрутили. Хорошая связка. Tk под питон тоже неплох, но такой органичной интеграции как с Tcl на нём не получить…


  1. procode
    29.08.2019 07:24

    мерси. заценим. а то задрало уже между мингв и кмд переключаться постоянно. хочется чего-то универсального под винду.


    1. mjr27
      30.08.2019 12:43

      Дисклеймер: что-то чувствую себя евангелистом. Я реально не хотел, так совпало.


      Powershell универсален. Сейчас использую его как дефолтный шелл под обе операционки.


      Не идеал, но разумно близкое к нему приближение