Shell-сценарий — исходный файл, специально созданный для интерпретатора командной строки типа Bash. Программисты обычно пишут Shell-сценарии для повышения производительности за счет автоматизации повторяющихся задач, таких как:

  • обработка файлов;
  • установка среды;
  • запуск тестовых стеков и развертывания.

Кроме того, Shell-сценарии используются внутри виртуальных машин или CI/CD сервисов, обеспечивая чистые и настраиваемые тестовые прогоны или развертывания.

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

Например, вы можете использовать Python для создания современных Shell-сценариев, реализуя их с помощью интерпретатора Python так же, как и сценарии Bash. Можете инициировать другие Unix-процессы внутри исходного файла Python, как это делается в Bash. Кроме того, JavaScript является отличной альтернативой для быстрого написания автоматизированных сценариев благодаря Nodejs.

Таким образом, можно писать Shell-сценарии с помощью Bash, Python и JavaScript. Каждая из этих технологий, как и любая другая технология в разработке программного обеспечения, имеет свои плюсы и минусы. В этой статье я расскажу, как для создания Shell-сценариев можно использовать языки Bash, Python и JavaScript с учетом их плюсов и минусов. Более того, я объясню, как выбрать подходящий язык для вашего следующего Shell-сценария.

Использование Bash для написания Shell-сценариев

Каждая популярная операционная система обычно предлагает интерфейс командной строки (CLI) через приложение терминала. Приложение терминала выполняет команды через определенный интерпретатор командной строки, такой как Bash, Z shell, C shell и KornShell. Определенные команды помещаются в файл и выполняются через выбранный интерпретатор командной строки. Другими словами, мы можем писать Shell-сценарии с помощью Bash, Z shell и т. д. Bash является широко используемым интерпретатором командной строки, поскольку он включен по умолчанию почти во все Unix или Unix-подобные операционные системы. Поэтому с помощью Bash можно писать переносимые POSIX-сценарии.

Bash позволяет писать Shell-сценарии с минимальной грамматикой. Если нужно выполнить несколько команд, достаточно поместить их в сценарий Bash построчно. Bash поддерживает основные концепции программирования:

  • операторы if-else;
  • циклы;
  • арифметические операции;
  • функции;
  • переменные.

Bash поддерживает процессы нативно. Иначе говоря, вы можете инициировать другие двоичные файлы в качестве команд. Например, если вам нужно выполнить двоичный ping, можете написать команду ping в своих сценариях Bash. Есть несколько способов отображения графического интерфейса с помощью сценариев Bash.

Bash — это командный язык, а не язык программирования общего назначения. Поэтому с усложнением логики вашего автоматизированного сценария он становится более запутанным и менее читаемым. Кроме того, Bash все и всегда воспринимает как команду, потому что это командный язык. См. следующий пример:

#!/bin/bash
x=10
echo $x # prints 10
x = 10 # x: command not found
echo $x

У Bash нет стандартного API, однако он поставляется с простыми встроенными функциями (например, со встроенной тестовой обработкой). Однако вам часто придется создавать процессы для обработки данных (помните sed?). Таким образом, Bash работает очень медленно по сравнению с другими языками, предназначенными для создания автоматизированных сценариев.

Использование Python для написания Shell-сценариев

Python — популярная альтернатива Bash для написания сценариев настройки среды, сборки и выпуска. Я знаю, что проект Electron использует Python для сценариев нескольких утилит. В Python нельзя выполнять команды напрямую, поскольку это не командный язык. Но запуск команд и перехват вывода реализуются проще простого с помощью модуля subprocess. Взгляните на следующий пример:

#!/usr/bin/python3
import subprocess
o = subprocess.check_output(['node', '--version'], text = True)
print('You are using Node ' + o)

Приведенный выше сценарий Python печатает текущую компьютерную версию Nodejs. Этот сценарий эквивалентен следующему сценарию Bash:

#!/usr/bin/bash
o=$(node --version)
echo You are using Node $o

Используя встроенные функции Python, можно писать современные сложные Shell-сценарии. Но, в отличие от Bash, интерпретатор Python изначально не поддерживает выполнение процесса. Поэтому, если нужно упростить сценарий Python, чтобы он больше походил на Bash, используется такой инструмент, как Shellpy. Посмотрите на следующий сценарий Shellpy, который выполняет работу предыдущего сценария:

#!/usr/local/bin/shellpy3
o = `node --version
print('You are using Node ' + o.stdout)

Python — язык, очень удобный для разработчиков. Кроме того, он поставляется со многими полезными встроенными библиотеками. Интерпретатор Python предустановлен почти во все Unix-подобные операционные системы. Поэтому Python также является хорошей альтернативой для написания переносимых автоматизированных сценариев.

Но в отличие от других языков, для Python характерно медленное время выполнения программы. Когда вы используете некоторые библиотеки, Python работает слишком медленно даже по сравнению с Bash. Такие инструменты, как Shellpy и Plumbum, предлагают удобные API для работы с процессами и командами. Тем не менее, вам придется настроить и написать дополнительный код.

Использование JavaScript для написания Shell-сценариев

Как известно, JavaScript был создан как язык сценариев для веб-браузера, чтобы сделать веб-страницы более динамичными. Проект Nodejs вывел JavaScript из “песочницы” браузера на уровень операционной системы. Nodejs предложил API дочерних процессов для инициации новых процессов. Также Nodejs представил несколько кроссплатформенных API для работы с файлами, сетью и консолью. Теперь и JavaScript, и Nodejs включают все функции, необходимые для создания современных автоматизированных сценариев.

Nodejs не поддерживает бинарные процессы, как Python. Но вы можете запускать другие двоичные исполняемые файлы через API дочерних процессов. Посмотрите на следующий пример, который отражает архитектуру процессора:

#!/usr/bin/node
let exec = require('child_process').exec;
exec('arch', function(error, stdout, stderr) {
console.log(`Your computer's CPU architecture is ${stdout}`);
});

Приведенный выше Nodejs-сценарий не похож на Shell-сценарий из-за функции обратного вызова. Поэтому необходимо проделать дополнительную работу, чтобы он выглядел как простой Shell-сценарий. Проект zx от Google был недавно представлен для решения этой проблемы с Shell-сценариями на основе JavaScript. Вы можете упростить синтаксис приведенного выше кода и написать следующий сценарий с помощью zx.

#!/usr/bin/env zx
$.verbose = false
let arch = await $`arch`
console.log(`Your computer's CPU architecture is ${arch}`)

Инструмент zx предоставляет почти все возможности, необходимые для написания Shell-скриптов. Встроенная поддержка JSON в JavaScript — это отличная возможность для создания сложных и современных Shell-скриптов. Но ни один движок CI/CD, как и популярная Unix или Unix-подобная операционная система, не предоставляют по умолчанию среду выполнения Nodejs и менеджер пакетов.

Какой язык лучше?

У нас есть много языков программирования общего назначения. Мы можем ранжировать их по популярности, но выделить лучший по общим характеристикам невозможно. Если бы был такой идеальный язык программирования, то все разработчики использовали бы его. Поскольку такого языка нет, каждому из нас приходится выбирать подходящий язык программирования в соответствии с нашими потребностями.

Делайте свой выбор между Bash, Python и JavaScript при написании Shell-сценариев, основываясь на следующих фактах и условиях:

  • Если вам нужно часто инициировать процессы и писать небольшой переносимый Shell-сценарий для Unix или Unix-подобных операционных систем, Bash, несомненно, будет хорошим выбором. Например, я написал сценарий Bash для сборки двоичных файлов проекта с открытым исходным кодом, основанного на пользовательской архитектуре.
  • Если вам нужно написать кроссплатформенный Shell-скрипт для обработки некоторых данных и выполнения определенных команд, можете выбрать Python. Например, в проекте Electron есть несколько сценариев Python для обработки и загрузки файлов. Однако не стоит ожидать высокой производительности от Shell-сценариев на базе Python.
  • JavaScript отлично подходит для тех же сценариев, что и Python. Однако, в отличие от Python, JavaScript имеет некоторые дополнительные преимущества. JavaScript быстр, изначально поддерживает JSON и имеет впечатляющие встроенные функции. Я нашел несколько сценариев Shell на базе Javascript в каталоге сценариев репозитория React Native.

Читайте также:

Читайте нас в Telegram, VK и Дзен


Перевод статьи Shalitha Suranga: Bash vs. Python vs. JavaScript: Which Is Better for Automation?

Предыдущая статья11 уникальных однострочников JavaScript, достойных восхищения
Следующая статьяИнструменты для быстрого овладения наукой о данных