zx – bash скрипты на javascript

от автора

Bash широко используется в программировании и является превосходным инструментом, но и у него есть свои недостатки. Поэтому Google разработал пакет zx, который позволяет использовать bash внутри javascript / typescript и имеет около 17к звёзд на github. В данной статье будут рассмотрены плюсы и минусы библиотеки, главные аспекты использования и примеры работы.

Стандартная библиотека Node.js предосталяет возможность написания bash скриптов, но zx справляется с этим намного лучше. Пакет реализовывает удобные асинхронные оболочки над child_procces, позволяет не использовать множество аргуметов, а также представляет основные команды bash, такие как cd, pwd и т.п, из коробки.

Фичи

  • Все функции ($, cd, fetch и т.д.) доступны сразу без какого-либо импорта.
  • Выполнение команды возвращает ProcessPromise<T>
  • Поддержка Node.js streams
  • Использование require() в ESM модулях
  • Автоматическое экранирование данных массива, переданных в команду
  • Выполнение markdawn файлов
  • Выполнение скриптов по http

Применение

Для успешной работы следует описать скрипт в ESM модуле. Это необходимо, чтобы использовать оператор await сразу на выполняемой команде. Если необходимо использовать обычный .js/.ts файл, то нужно обернуть функции в void async function () {...}().

В первой строке файла необходимо добавить:

  #!/usr/bin/env zx 

Для запуска можно использовать как bash:

  chmod +x ./script.mjs   ./script.mjs 

Так и zx:

  zx ./script.mjs 

Чтобы изменить облочку, в которой должен выполняться скрипт, нужно использовать команду $.shell:

  $.shell = '/usr/bin/zsh' 

Помимо использования стандартных bash команд с помощью zx можно писать и свои. Для этого следует использовать обёртку вида await $`command`, которая выполняет описанную команду. При нулевом коде завершения программы возвращается объект ProcessPromise<T>, который имеет следующую структуру:

  class ProcessPromise<T> extends Promise<T> {     readonly stdin: Writable     readonly stdout: Readable     readonly stderr: Readable     readonly exitCode: Promise<number>     pipe(dest): ProcessPromise<T>   } 

При другом любом другом коде завершения выбрасывается исключение ProcessOutput, которое имеет следующую структуру:

  class ProcessOutput {     readonly stdout: string     readonly stderr: string     readonly exitCode: number     toString(): string   } 

В случае, когда нужно узнать, какой код возвращает определённая команда, можно применить функцию notthrow(), использование которой предотвращает выбрасывание исключения и возвращает ProcessPromise<T>.

Используемые пакеты

В zx включено несколько пакетов, которые доступны без импорта. Один из них – chalk, он может быть применён для настройки стилей вывода текста в терминал. Пример использования:

  console.log(chalk.purple('Hello world!')) 

Ещё включён пакет fs для работы с файловой системой.

  let greetingMessage = await fs.readFile('./greetings.txt') 

Пакет os обеспечивает работу с операционной системой.

  await $`cd ${os.homedir()} && touch Documents/page1.txt` 

Сравнение с аналогами

Существует проект shellpy, который реализовывает работу с bash из python, но, к сожалению, так и не вышла stable версия, поэтому использовать его в продакшене — не лучшая идея. Существует возможность использования subprocess в python, но это затратно по времени и не предоставляет настолько же удобной работы, как zx.

В java тоже есть возможность работы с shell, но нет обёртки над основными командами, поэтому всю логику приходится реализовывать с помощью средств языка, что уже не является основной целью данной статьи.

Кроме этого существует много языков, в которых можно работать с bash, но на их описание уйдёт крайне много времени.

Вывод

zx — мощная библиотека для работы с bash из javascript. Проект развивается и поддерживается Google. В нём уже реализованы основные функции, которые можно легко и быстро использовать без самописных обёрток. Ко всему этому все процессы выполняются асинхронно, что в большинстве случаев улучшает производительность. А сама возможность использования bash в высокоуровневом языке программирования позволяет с лёгкостью писать скрипты для автоматизации процессов в ОС.


На правах рекламы

Облачный хостинг для бизнеса и любых крупных проектов — максимальная конфигурация — 128 ядер CPU, 512 ГБ RAM, 4000 ГБ NVMe, надёжные дата-центры, защита от DDoS-атак «из коробки», активация любого сервера в течение минуты!

Подписывайтесь на наш чат в Telegram.

ссылка на оригинал статьи https://habr.com/ru/company/vdsina/blog/563312/


Комментарии

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

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