Node.jsでシェルコマンドを実行してそのまま出力する

2023/05/23に公開

方法

※長くなってしまうため child_processspawn についての説明は省きます。

結論として、 spawn の第三引数に { shell: true, stdio: 'inherit' } を入れるとできます。

shell: true で OS によってうまく処理をしてくれるらしいです。


require('child_process').spawn('コマンド', [], { shell: true, stdio: 'inherit' });

stdout.on('data') では、何がダメなのか?

↓こういう書き方では何がダメか?


const log = require('child_process').spawn('sh', ['-c', 'コマンド']);

log.stdout.on('data', (data) => {
  process.stdout.write(data);
});

log.stderr.on('data', (data) => {
  process.stderr.write(data);
});


  1. OSによる分岐ができていません。
  2. 色付きの文字の色がなくなってしまったり何かしら情報が欠落する(必ずしも色がなくなるわけではありませんが)

自分自身このやり方で実装している時期があり、色が全部白くなってしまうことを悩んでいましたが、最初に紹介した方法で解決できました。

参考

https://stackoverflow.com/a/37214215

Discussion