Node.jsでシェルコマンドを実行する際にchild_process.execではaliasが使えない
タイトルの通りですが、例えばNode.jsで以下のようなシェルコマンドを実行をしようと思った時、
// 同期的に実行するためにexecSyncを例に使用する const execSync = require('child_process').execSync; // hogefugaはalias // alias hogefuga="hoge hoge fuga fuga"みたいに設定されている想定 const res = execSync('hogefuga'); ...
上記のコードではaliasで設定したシェルコマンドは実行できませんでした。古いですがGithubにもissueがありました。
どうしよう、よくわからないnpmパッケージ入れるのも嫌だなあ(ちゃんと探せば便利なのあるはずですが)と思っていたところ、以下のChromeの記事を参考にすることで解決しました。
以下のコードは上記記事からの転載です。execFile
を使ってaliasで指定しているアプリーケション等を直接参照すれば良いんですね。
const execFile = require('child_process').execFile; function launchHeadlessChrome(url, callback) { // macOS を想定 const CHROME = '/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome'; execFile(CHROME, ['--headless', '--disable-gpu', '--remote-debugging-port=9222', url], callback); } launchHeadlessChrome('https://www.chromestatus.com', (err, stdout, stderr) => { ... });
child_process.exec
とchild_process.execFile
の違いはこれが参考になりそうです。