[Một gói mỗi ngày] Tại sao chúng tôi sử dụng zx để thay thế các tập lệnh Bash

By hientd, at: 11:12 Ngày 07 tháng 7 năm 2025

Thời gian đọc ước tính: __READING_TIME__ minutes

[One Package Per Day] Why We Use zx to Replace Bash Scripts
[One Package Per Day] Why We Use zx to Replace Bash Scripts

Nếu bạn từng nhìn vào một script Bash và nghĩ, “Phải có cách tốt hơn chứ”, thì chào mừng bạn đến câu lạc bộ.

 

Tại Glinteco, chúng tôi duy trì rất nhiều tự động hóa nội bộ, script thiết lập dev, luồng triển khai, sao lưu, trình trợ giúp dàn dựng Docker. Một thời gian, chúng tôi sử dụng Bash mặc định. Nhưng khi script trở nên phức tạp hơn, chúng tôi bắt đầu cảm thấy những giới hạn: địa ngục trích dẫn, xử lý lỗi kém, thiếu cấu trúc. Hãy giới thiệu zx, một công cụ dựa trên Node.js giúp việc viết script shell thực sự thú vị.

 

Hãy cùng xem xét lý do tại sao chúng tôi hiện đang sử dụng zx cho hầu hết các nhu cầu viết script của mình.

 

zx là gì?

 

Được tạo bởi nhóm tại Google, zx là một thư viện cho phép bạn viết script shell bằng JavaScript (hoặc TypeScript). Hãy nghĩ về nó như Node.js với những siêu năng lực như các lệnh shell có thể chờ đợi, các tiện ích tích hợp như fs, os và thậm chí cả globs.

 

Thay vì:

#!/bin/bash
echo "Hello, $1"

 

Bạn viết:

 

#!/usr/bin/env zx
console.log(`Hello, ${process.argv[2]}`);

 

Và đột nhiên các script của bạn trở nên dễ đọc, có thể kiểm thử và dễ bảo trì.

 

Tại sao chúng tôi đã bỏ Bash để sử dụng zx

 

1. Cú pháp dễ đọc và quen thuộc

 

Hầu hết nhóm của chúng tôi đã thành thạo JavaScript và TypeScript. Với zx, chúng tôi không còn phải vật lộn với những điểm kỳ lạ về cú pháp như:

 

if [[ -z "$VAR" ]]; then ...

 

Bây giờ chúng tôi viết:

 

if (!process.env.VAR) { ... }

 

2. Async/Await miễn phí

 

Bạn đã từng cố gắng song song hóa các tiến trình Bash với &, chờ chúng và xử lý lỗi một cách sạch sẽ chưa? Chúng tôi đã từng. Thật tệ.

 

Với zx, chúng tôi làm:

 

await Promise.all([
  $`command1`,
  $`command2`
]);

 

Tuyệt vời. Đồng thời dễ dàng, tích hợp sẵn.

 

3. An toàn và sạch hơn

 

Với Bash, một khoảng trắng không thoát hoặc một dấu ngoặc kép bị quên có thể phá hủy hệ thống của bạn. Trong zx, việc nội suy chuỗi `$`` tự động thoát an toàn các đối số:

 

const branch = 'main';
await $`git checkout ${branch}`;

 

Không cần lo lắng về việc tiêm hoặc các ký tự lạ nữa.

 

4. Sự tốt lành của thư viện chuẩn

 

Bạn nhận được:

 

  • Mô-đun fs, path, os
     

  • chalk, globby, yaml, v.v.
     

  • Chờ đợi ở cấp cao nhất

 

Bạn muốn đọc cấu hình và sử dụng nó? Dễ dàng:

 

import fs from 'fs/promises';
const config = JSON.parse(await fs.readFile('./config.json', 'utf8'));

 

5. Thân thiện với đa nền tảng

 

Bash không phải lúc nào cũng là Bash. (Nhìn bạn này, macOS so với Linux so với Git Bash trên Windows.)

 

Với Node + zx, các script của bạn chạy giống nhau ở mọi nơi Node chạy. Và đó là một vấn đề lớn khi hướng dẫn các nhà phát triển hoặc tự động hóa các pipeline CI/CD.

 

Trường hợp sử dụng thực tế: Script thiết lập dev của chúng tôi

 

Trước đây:

 

#!/bin/bash
echo "Setting up..."
cd backend || exit 1
pip install -r requirements.txt
cd ../frontend || exit 1
npm install

 

Sau đó:

 

#!/usr/bin/env zx

await $`cd backend && pip install -r requirements.txt`
await $`cd ../frontend && npm install`

console.log(' Setup complete!');

 

Chúng tôi thậm chí còn thêm các kiểm tra như phiên bản Python hoặc Node bị thiếu và đưa ra các lỗi thân thiện với người dùng, tất cả đều dễ dàng hơn trong JS.

 

Nhược điểm?

 

Hãy thành thật mà nói, có một vài sự đánh đổi.

 

  • Bạn cần cài đặt Node.js.
     

  • Hiệu năng chậm hơn một chút so với Bash đối với các script rất nhỏ.
     

  • Bạn không thể chạy nó ở nơi Node không được phép (ví dụ: container CI nghiêm ngặt).

 

Nhưng trong 95% trường hợp sử dụng của chúng tôi, những lợi ích vượt xa những nhược điểm.

 

Suy nghĩ cuối cùng

 

Chúng tôi vẫn sử dụng Bash cho các dòng lệnh nhỏ. Nhưng đối với bất cứ thứ gì hơn 10 dòng, zx chiến thắng (tuyệt đối). Nó dễ đọc, mạnh mẽ và cho phép chúng tôi viết script mà không cảm thấy như mình đang hy sinh sự tỉnh táo của mình.

 

Nếu bạn đang viết rất nhiều script và nhóm của bạn đã quen thuộc với JavaScript hoặc TypeScript, hãy thử zx. Bạn có thể sẽ không bao giờ quay lại.

 

Tag list:
- modern shell scripting
- zx tutorial
- javascript shell scripting
- bash script replacement
- nodejs zx
- zx vs bash

Liên quan

Theo dõi

Theo dõi bản tin của chúng tôi và không bao giờ bỏ lỡ những tin tức mới nhất.