Node.jsでコマンド実行
Node.jsでコマンドラインバイナリを実行する
Node.jsでは、child_process
モジュールを利用して、コマンドラインバイナリを実行することができます。これにより、Node.jsアプリケーションから外部のプログラムやツールを呼び出し、その出力を処理したり、入力を受け取ったりすることができます。
基本的な使い方
const { spawn } = require('child_process');
// コマンドを実行する
const child = spawn('ls', ['-l']);
// 出力を標準出力に表示する
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
// エラーを標準エラー出力に表示する
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
// コマンドが終了したときに処理を実行する
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
重要なポイント
- 終了コード
close
イベントでコマンドの終了コードを取得できます。 - 標準エラー出力
stderr
イベントで標準エラー出力を取得できます。 - 引数
第二引数には、コマンドに渡す引数を配列で指定します。 - コマンド名
spawn
関数に渡す最初の引数は、実行したいコマンドの名前です。
他のメソッド
- fork
子プロセスをフォークして、新しいNode.jsプロセスとして実行します。 - execFile
ファイルパスを指定してコマンドを実行します。 - exec
コマンドを実行し、その出力を文字列として取得します。
Rubyでの対応
Rubyでは、system
メソッドや%x
演算子を使って、コマンドラインバイナリを実行できます。
# systemメソッド
system("ls", "-l")
# %x演算子
output = %x{ls -l}
puts output
JavaScriptでの対応
JavaScriptでは、ブラウザの環境では直接コマンドラインバイナリを実行することはできません。しかし、Node.jsを使用することで、サーバーサイドでコマンドラインバイナリを実行することが可能です。
const { spawn } = require('child_process');
// コマンドを実行する
const child = spawn('ls', ['-l']);
// 出力を標準出力に表示する
child.stdout.on('data', (data) => {
console.log(`stdout: ${data}`);
});
// エラーを標準エラー出力に表示する
child.stderr.on('data', (data) => {
console.error(`stderr: ${data}`);
});
// コマンドが終了したときに処理を実行する
child.on('close', (code) => {
console.log(`child process exited with code ${code}`);
});
コード解説
- モジュールのインポート
child_process
モジュールをインポートします。 - コマンドの実行
spawn
関数を使用して、ls
コマンドを実行します。第二引数には、コマンドに渡す引数を配列で指定しています。 - 標準出力の処理
stdout
イベントが発生すると、コマンドの標準出力を取得し、コンソールに表示します。 - 終了処理
close
イベントが発生すると、コマンドが終了したことを示し、終了コードをコンソールに表示します。
# systemメソッド
system("ls", "-l")
# %x演算子
output = %x{ls -l}
puts output
execメソッド
const { exec } = require('child_process');
exec('ls -l', (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error}`);
} else {
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
}
});
execFileメソッド
const { execFile } = require('child_process');
execFile('ls', ['-l'], (error, stdout, stderr) => {
if (error) {
console.error(`error: ${error}`);
} else {
console.log(`stdout: ${stdout}`);
console.error(`stderr: ${stderr}`);
}
});
forkメソッド
const { fork } = require('child_process');
const child = fork('child.js');
child.on('message', (message) => {
console.log(`message from child: ${message}`);
});
child.send('hello from parent');
spawnSyncメソッド
spawnSync
メソッドは、コマンドを同期的に実行し、その出力をオブジェクトとして取得します。
const { spawnSync } = require('child_process');
const result = spawnSync('ls', ['-l']);
if (result.error) {
console.error(`error: ${result.error}`);
} else {
console.log(`stdout: ${result.stdout.toString()}`);
console.error(`stderr: ${result.stderr.toString()}`);
}
Promiseベースのメソッド
child_process
モジュールには、Promiseベースのメソッドも提供されています。
const { exec } = require('child_process');
const util = require('util');
const execPromise = util.promisify(exec);
execPromise('ls -l')
.then((result) => {
console.log(`stdout: ${result.stdout}`);
console.error(`stderr: ${result.stderr}`);
})
.catch((error) => {
console.error(`error: ${error}`);
});
javascript ruby node.js