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がありました。

github.com


どうしよう、よくわからないnpmパッケージ入れるのも嫌だなあ(ちゃんと探せば便利なのあるはずですが)と思っていたところ、以下のChromeの記事を参考にすることで解決しました。

developers.google.com


以下のコードは上記記事からの転載です。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.execchild_process.execFileの違いはこれが参考になりそうです。

stackoverflow.com