JavaScript

JavaScript로 shell 스크립트 작성하기 😎 Google’s zx 라이브러리

citron031 2025. 1. 22. 21:24

JavaScript는 브라우저뿐만 아니라 Node.js 덕분에 서버에서도 자주 사용된다.
그런데 이 언어를 활용해 터미널 명령어를 실행하는 shell 스크립트를 작성할 수 있다면 얼마나 좋을까?

 

이런 요구사항을 Google의 zx 라이브러리가 만족한다 👍

이번엔 zx 라이브러리를 실제로 사용해본 경험을 공유하기로 했다.

 

zx란 ❓

zx는 Google이 개발한 Node.js 기반의 라이브러리로, JavaScript나 TypeScript를 사용하여 터미널 명령어를 실행하는 스크립트를 간단하고 직관적으로 작성할 수 있게 해준다.

✨ 따라서, shell 스크립트가 생소한 JS 개발자가 손쉽게 스크립트를 작성할 수 있게 해준다

  • 기존의 스크립트와 비교했을 때 더 강력한 기능과 유연성을 제공한다.

zx의 장점 😎

  1. 간결한 문법
    • 터미널 명령어를 JavaScript의 템플릿 리터럴(` `)로 실행할 수 있다.
      • $`git commit -m "커밋 스크립트 실행하기"`;
    • 복잡한 명령어를 처리하는 코드가 훨씬 읽기 쉬워진다. (JS 코드니까)
  2. JavaScript의 생태계를 활용
    • 또 다른 npm 패키지를 활용하여 복잡한 작업을 쉽게 처리할 수 있다.
    • 파일 시스템 작업, HTTP 요청 등 JavaScript의 모든 기능을 사용할 수 있다.
      • 때문에 더 복잡한 작업을 스크립트로 처리할 수 있게 해준다 🙌
  3. 비동기 처리
    • 모든 명령어는 기본적으로 비동기로 실행되며, await 키워드를 사용하여 동기적으로 처리할 수 있다.
  4. 기존 shell 스크립트와의 친화성
    • shell 스크립트를 작성하는 데 익숙한 개발자도 쉽게 적응할 수 있다.

설치 및 기본 사용법 🔭

먼저, zx를 프로젝트에 설치한다.

npm install zx

그런 다음, .mjs 확장자를 사용하는 파일을 생성하고 다음과 같이 작성한다.

#!/usr/bin/env zx

import { $ } from "zx";

// 터미널 명령어 실행
await $`echo "Hello, World!"`;

// 파일 읽기
const text = await $`cat sample.txt`;
console.log(text);

스크립트를 실행하려면 다음과 같이 입력하면 된다.

node script.mjs

 

ZX를 사용하면 다양한 작업을 손쉽게 스크립트로 작성할 수 있다.

예를 들면 매번 프로젝트 빌드, 테스트, 배포 과정에서 반복적인 명령어를 입력해야 한다면 시간 낭비가 심하니까 이를 해결하는 스크립트를 작성할 수 있다 👻

 

코드로 작성하면 다음과 같다.

 

#!/usr/bin/env zx

import { $ } from "zx";

// 의존성 설치
await $`npm install`;

// 테스트 실행
await $`npm test`;

// 빌드 실행
await $`npm run build`;

console.log("프로젝트 자동화 완료!");

서버관리 스크립트도 작성할 수 있다고 한다.

여러 서버에 배포하거나 설정을 변경할 때 반복 작업이 많은데, 이를 스크립트로 작성할 수 있다.

zx를 사용하면 SSH 명령어도 다음과 같이 쉽게 사용할 수 있다.

#!/usr/bin/env zx

import { $ } from "zx";

const servers = ["server1.example.com", "server2.example.com"];

for (const server of servers) {
  console.log(`Deploying to ${server}...`);
  await $`ssh user@${server} "cd /var/www && git pull && pm2 restart all"`;
}

console.log("배포 완료!");

CI/CD 파이프라인 스크립트도 작성할 수 있다.

물론, zx를 사용해 파이프라인을 JS를 사용해 스크립트로 작성할 수 있다.

#!/usr/bin/env zx

import { $ } from "zx";

if (process.env.BRANCH === "main") {
  console.log("배포 시작...");
  await $`npm run deploy`;
  console.log("배포 완료!");
} else {
  console.log("메인 브랜치가 아니므로 배포를 건너뜁니다.");
}

 

 

개인적으로 스크립트를 작성해본 경험이 별로 없어서 스크립트 작성에 대한 생각을 해본적이 없었는데,

zx를 사용해 친숙한 자바스크립트로 코드를 작성할 수 있으니 JS 개발자라면, 꼭 사용해봤으면 좋겠다 😊

 

❗ 하지만, 주의해야할 점은 zx는 node의 라이브러리이기 때문에, 기존의 shell스크립트와는 다르게 node.js의 런타임에 종속적이게 된다는 점이다. (완벽하게 shell 스크립트를 대체할 수는 없다)

 

 

✨ zx로 실제 작성한 코드 (프로젝트에 필요한 프로그램의 pre install을 도와주는 스크립트)
https://github.com/citron03/practice-next-15/blob/main/.scripts/ready-script.mjs

 

practice-next-15/.scripts/ready-script.mjs at main · citron03/practice-next-15

Practice React 19, Next 15 (with react compiler). Contribute to citron03/practice-next-15 development by creating an account on GitHub.

github.com