Bash、Python和JavaScript哪個指令碼更適合執行自動化任務?- Suranga

banq發表於2021-11-13

比較 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 指令碼。

相關文章