Bash、Python和JavaScript哪个脚本更适合执行自动化任务?- Suranga


比较 Bash、Python 和基于 JavaScript 的 Shell 脚本的优缺点:
Shell 脚本是指专门为 Bash 等命令行解释器创建的源文件。程序员经常编写 Shell 脚本,通过自动化他们重复执行的任务来提高生产力。例如,他们为文件操作、环境设置、运行测试套件和部署编写自动化脚本。
Shell 脚本通常在命令行解释器上运行。但是,我们可以使用流行的通用编程语言编写 Shell 脚本,并且仍然称它们为 Shell 脚本。
您可以使用 Python 创建现代 Shell 脚本,并像 Bash 脚本一样使用 Python 解释器执行它们。您可以在 Python 源文件中生成其他 Unix 进程,就像使用 Bash 一样。此外,由于 Nodejs 运行时,JavaScript 是快速编写自动化脚本的绝佳替代方案。
 
使用 Bash 编写 Shell 脚本
Bash 是一种广泛使用的命令行解释器,因为它默认包含在几乎所有 Unix 或类 Unix 操作系统中。因此,您可以使用 Bash 编写可移植的 POSIX 脚本。
Bash 是一种命令语言,而不是通用编程语言。因此,当您的自动化脚本的逻辑增长时,它会变得更加复杂且不可读。此外,Bash 总是试图将所有内容都视为命令,因为它是一种命令语言。请参阅以下示例:

#!/bin/bash 
x=10 
echo $x # 打印 10
 
x = 10 # x: 找不到命令
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('你正在使用 Node ' + o)

上面的 Python 脚本打印了计算机的当前 Nodejs 版本。该脚本等效于以下 Bash 脚本:
#!/usr/bin/bash
o=$(node --version) 
echo 您正在使用 Node $o

现在,您可以使用 Python 的内置功能编写现代丰富的 Shell 脚本。但是,Python 解释器本身并不像 Bash 那样支持流程执行。因此,如果我们需要进一步简化 Python 脚本,使其看起来更像 Bash,我们必须使用Shellpy 之类的工具。看看下面的 Shellpy 脚本,它完成了上一个脚本的工作:
#!/usr/local/bin/shellpy3
o = `node --version 
print('你正在使用 Node ' + o.stdout)

Python 是一种对开发人员非常友好的语言。此外,它还带有许多有用的内置库。Python 解释器预装在几乎所有类 Unix 操作系统中。因此,Python 也是编写可移植自动化脚本的不错选择。
但是与其他语言相比,Python 的程序执行时间很慢。当您使用某些库时,即使与 Bash 相比,Python 的执行速度也太慢。Shellpy 和Plumbum等工具提供了方便的 API 来处理进程和命令。但是,我们仍然需要设置和编写一些额外的代码。
 
使用 JavaScript 编写 Shell 脚本
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(`你电脑的 CPU 架构是 ${stdout}`); 
});

由于回调函数,上面的 Nodejs 脚本看起来不像 Shell 脚本。因此,您必须做一些额外的工作,使其看起来像一个简单的 Shell 脚本。最近引入了Google 的zx项目,以使用基于 JavaScript 的 Shell 脚本解决这个问题。我们确实可以简化上面代码的语法,用zx编写如下脚本。

#!/usr/bin/env zx 
$.verbose = false
let arch = await $`arch` 
console.log(`你电脑的 CPU 架构是 ${arch}`)

zx 工具提供了编写 Shell 脚本所需的几乎所有功能。JavaScript 的原生 JSON 支持是一个很棒的功能,可以制作丰富的现代 Shell 脚本。但是,默认情况下,每个 CI/CD 引擎和流行的 Unix 或类 Unix 操作系统都不提供 Nodejs 运行时和包管理器。
 
哪个更好?
您可以根据以下事实和条件选择 Bash、Python 或 JavaScript 来编写 Shell 脚本。

  • 如果您需要频繁地生成进程,并且需要为 Unix 或类 Unix 操作系统编写一个稍微小巧的可移植 Shell 脚本,那么 Bash 无疑是一个不错的选择。例如,我编写了一个 Bash脚本来构建基于用户输入架构的开源项目的二进制文件。
  • 如果你需要写一个跨平台的 Shell 脚本来在执行一些命令的同时处理一些数据,你可以选择 Python。例如,Electron 项目有一些 Python脚本来处理和上传文件。但是,不要期望基于 Python 的 Shell 脚本有如此高的性能。
  • JavaScript 也适用于适合 Python 的场景。与 Python 相比,JavaScript 在编写 Shell 脚本方面有一些额外的优势。JavaScript 速度很快,本机支持 JSON,并且具有令人印象深刻的内置功能。我从 React Native 存储库的脚本目录中找到了一些基于 Javascript 的 Shell 脚本。