Node.jsのchild_processモジュールでシェルコマンドを実行
Node.jsでシェルコマンドを実行して出力を取得する方法
child_processモジュールを使用する
これは最も一般的で柔軟な方法です。child_process
モジュールは、子プロセスを生成して、その入出力と終了ステータスを制御するためのAPIを提供します。
以下のコードは、ls
コマンドを実行し、その出力をコンソールに出力する例です。
const childProcess = require('child_process');
childProcess.exec('ls', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
このコードでは、childProcess.exec()
関数を使用して、ls
コマンドを実行します。この関数は、コマンド、オプション、およびコールバック関数を引数として取ります。コールバック関数は、エラー、標準出力、標準エラーが出力されるたびに呼び出されます。
spawn関数を使用する
spawn
関数は、より低レベルなAPIを提供し、より多くの制御と柔軟性を提供します。以下のコードは、ls
コマンドを実行し、その出力をコンソールに出力する例です。
const childProcess = require('child_process');
const ls = childProcess.spawn('ls');
ls.stdout.on('data', (data) => {
console.log(data.toString());
});
ls.stderr.on('data', (data) => {
console.error(data.toString());
});
ls.on('close', (code) => {
if (code !== 0) {
console.error(`child process exited with code ${code}`);
}
});
このコードでは、childProcess.spawn()
関数を使用して、ls
コマンドを子プロセスとして生成します。この関数は、コマンド、オプション、およびオプションのSpawnOptionsオブジェクトを引数として取ります。
生成された子プロセスは、stdout
、stderr
、およびclose
イベントをエミットします。これらのイベントはそれぞれ、標準出力、標準エラー、および子プロセスの終了時に発生します。
一般的には、exec
関数をを使用することをお勧めします。これは、ほとんどのユースケースで十分に柔軟で使いやすいです。しかし、より多くの制御と柔軟性を必要とする場合は、spawn
関数を使用することができます。
その他の考慮事項
- シェルコマンドを実行する前に、そのコマンドがシステムで利用可能であることを確認してください。
- コマンドを実行する前に、必要な権限を持っていることを確認してください。
- コマンドの出力を処理する前に、エラーをチェックしてください。
- 大量のコマンド出力を処理する場合は、ストリーミングを使用することを検討してください。
child_processモジュールを使用する
const childProcess = require('child_process');
childProcess.exec('ls', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
spawn関数を使用する
const childProcess = require('child_process');
const ls = childProcess.spawn('ls');
ls.stdout.on('data', (data) => {
console.log(data.toString());
});
ls.stderr.on('data', (data) => {
console.error(data.toString());
});
ls.on('close', (code) => {
if (code !== 0) {
console.error(`child process exited with code ${code}`);
}
});
以下のコードは、その他の一般的なシェルコマンドを実行する例です。
pwd
: カレントディレクトリを出力します。
childProcess.exec('pwd', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
mkdir new_dir
:new_dir
という名前のディレクトリを作成します。
childProcess.exec('mkdir new_dir', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log('Directory created successfully');
});
rm file.txt
:file.txt
という名前のファイルを削除します。
childProcess.exec('rm file.txt', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log('File deleted successfully');
});
これらの例は、Node.jsでシェルコマンドを実行して出力を取得する方法を理解するための出発点として役立ちます。
Node.jsでシェルコマンドを実行して出力を取得するその他の方法
Promiseベースライブラリを使用する
execa
やbluebird-promisify
のようなPromiseベースライブラリを使用すると、非同期コードをより読みやすく、書きやすくすることができます。これらのライブラリは、Promise APIを使用して、シェルコマンドの実行と結果の取得をラップします。
const execa = require('execa');
(async () => {
try {
const { stdout } = await execa('ls');
console.log(stdout);
} catch (error) {
console.error(error);
}
})();
シェルスクリプトを使用する
複雑なコマンドや複数のコマンドを実行する必要がある場合は、シェルスクリプトを作成してNode.jsから実行することができます。これは、コードをよりモジュール化し、保守しやすくすることができます。
以下のコードは、script.sh
という名前のシェルスクリプトを実行し、その出力をコンソールに出力する例です。
const childProcess = require('child_process');
childProcess.exec('sh script.sh', (error, stdout, stderr) => {
if (error) {
console.error(error);
return;
}
console.log(stdout);
});
Node.jsの組み込みモジュールを使用する
Node.jsには、fs
やpath
などのシェルコマンドを実行するのに役立つ組み込みモジュールがいくつか用意されています。これらのモジュールを使用して、基本的なファイルシステム操作を実行したり、パスを操作したりすることができます。
以下のコードは、fs
モジュールを使用して現在のディレクトリの内容を出力する例です。
const fs = require('fs');
fs.readdir('.', (error, files) => {
if (error) {
console.error(error);
return;
}
console.log(files);
});
最適な方法を選択する
使用する方法は、要件と好みによって異なります。単純なコマンドを実行する場合は、child_process
モジュールまたはspawn
関数が最適です。より複雑なタスクの場合は、Promiseベースライブラリ、シェルスクリプト、またはNode.jsの組み込みモジュールを使用することを検討してください。
node.js shell command-line-interface