最近 zxツールというGoogle製のツールを使って見て、とても良かったので、zxツールの使い方について解説していきます。
zxとは何か?
zxは、Googleによって開発された、Node.js環境で動作するシェルスクリプトを実行するためのツールです。一般的なシェルスクリプト言語はBashやZshなどで、これらはコマンドラインインターフェース(CLI)での作業を自動化するために使われます。
zxは、これらのシェルスクリプトの一部分や、完全なシェルスクリプトをJavaScriptで書くことができるようにするものです。これにより、非常に簡潔で読みやすいコードを記述でき、Node.jsのエコシステムやパッケージを利用できます。zxは、ユーザーがシェルスクリプトを書く際の手間を軽減し、シェルスクリプトの複雑さや記述の難しさを取り除くことを目的としています。
具体的には、zxを使用すると、以下のようにJavaScriptでシェルコマンドを実行できます:
#!/usr/bin/env zx
await $`echo Hello, zx!`;
上記の例では、シェルコマンドecho Hello, zx!
をJavaScriptで記述し、zxを使って実行しています。zxはNode.js環境で動作するため、Node.jsがインストールされている環境で利用できます。このように、zxはシェルスクリプトをより簡潔かつ効果的に書くための手段として利用されます。
zxの何が良いのか?
- シンプルで読みやすいコード
zxはJavaScriptを使ってシェルスクリプトを書くことができ、JavaScriptのシンプルな構文を活かしています。これにより、簡潔で読みやすいコードを書くことができます。 - Node.jsのエコシステムと統合: zxはNode.js上で動作するため、Node.jsの豊富なエコシステムやパッケージを利用できます。これにより、様々なライブラリやツールをシェルスクリプト内で利用できます。
- 非同期処理のサポート: zxは非同期処理をサポートしており、非同期のタスクをシンプルに記述できます。これにより、ネットワークリクエストやファイルの読み書きなど、非同期処理が必要なタスクを効果的に扱うことができます。
- 標準出力とエラーのハンドリング: zxは標準出力やエラーを柔軟にハンドリングする機能を提供しており、コマンドの実行結果を効果的に処理できます。これにより、エラーハンドリングやパイプ処理などが簡単に行えます。
- 対話的な実行: zxは対話的にコマンドを実行することもでき、ユーザーとの対話的な操作をサポートしています。これにより、スクリプトの途中でユーザーに入力を求めたり、動的な操作を行ったりすることができます。
zxを使うための準備
準備方法は以下の通りです。
Node.jsのインストール
zxはNode.js上で動作するので、まずはNode.jsをインストールします。Node.jsの公式ウェブサイト(https://nodejs.org/)から最新の安定版をダウンロードし、インストールしてください。
zxのインストール
Node.jsがインストールされたら、ターミナルまたはコマンドプロンプトを開いて、以下のコマンドを実行してzxをインストールします。
npm install zx
zxのサンプルコードを動かそう
サンプルコード作成
sample.mjsを適当なディレクトリに作成しましょう。コードは以下のようにします。
console.log('hello world');
package.jsonにscriptタグ追加
scriptsを以下のように設定しましょう。「src/sample.mjs」の部分は先ほど作成したmjsファイルのパスを指定します。
{
"scripts": {
"start": "zx src/sample.mjs"
},
"dependencies": {
"zx": "^7.2.3"
}
}
zxを実行しましょう
以下のコマンドを実行しましょう。
npm start
以下のようにhello worldが表示されました。
zxの書き方
ログの書き方
ログは基本的にconsole.logで書きます。javascriptと同様なので分かりやすいですね。
Linuxのコマンドの場合は、「$`コマンドをここに書く`」という書き方で書くことができます。
#!/usr/bin/env zx
// console.log('hello world');
await $`echo hello world`
Linuxのコマンドはデフォルトでコンソールに表示される
以下のようにLinuxのコマンドは実行した内容がログに表示されます。デバッグにはとても便利です。
Linuxのコマンドをコンソールに表示させないようにするには?
verboseフラグをfalseにしましょう。具体的には以下のように書きます。
#!/usr/bin/env zx
$.verbose = false;
await $`echo hello world`
しかし、このままではechoの結果も表示されなくなってしまいました。
echoなどの結果は変数に格納することで、console.logで表示させることができます。以下のコードです。
#!/usr/bin/env zx
$.verbose = false;
const echoResult = await $`echo hello world`
console.log(echoResult);
ProcessOutputクラスに結果が格納されるので、結果の文字列だけ欲しい場合は、以下のようにstdoutだけログに出しましょう。
#!/usr/bin/env zx
$.verbose = false;
const echoResult = await $`echo hello world`
console.log(echoResult.stdout);
最後に
zxは強力なツールだと思います。スクリプトをshellで書くことがあるのですが、ログを出したり、エラーハンドリングしたりするのがとても大変です。(shellに慣れていないだけかもしれませんが)
zxを使うことで、shellを簡単に使うことができて、とても運用が楽になる実感がありました。
次の記事では、httpリクエストを投げたり、エラーハンドリングをやってみようかなと思います。
みなさんもぜひ一度はzxを触ってみてはいかがでしょうか!?