我正在将一个CLI库从Ruby移植到Node.js。在我的代码中,必要时我会执行几个第三方二进制文件。我不确定如何在Node中实现这一点。

下面是Ruby中的一个示例,我调用PrinceXML将文件转换为PDF:

cmd = system("prince -v builds/pdf/book.html -o builds/pdf/book.pdf")

Node中的等效代码是什么?


当前回答

如果您不介意依赖关系,并且希望使用promise,那么子进程promise可以:

安装

npm install child-process-promise --save

exec用法

var exec = require('child-process-promise').exec;
 
exec('echo hello')
    .then(function (result) {
        var stdout = result.stdout;
        var stderr = result.stderr;
        console.log('stdout: ', stdout);
        console.log('stderr: ', stderr);
    })
    .catch(function (err) {
        console.error('ERROR: ', err);
    });

派生用法

var spawn = require('child-process-promise').spawn;
 
var promise = spawn('echo', ['hello']);
 
var childProcess = promise.childProcess;
 
console.log('[spawn] childProcess.pid: ', childProcess.pid);
childProcess.stdout.on('data', function (data) {
    console.log('[spawn] stdout: ', data.toString());
});
childProcess.stderr.on('data', function (data) {
    console.log('[spawn] stderr: ', data.toString());
});
 
promise.then(function () {
        console.log('[spawn] done!');
    })
    .catch(function (err) {
        console.error('[spawn] ERROR: ', err);
    });

ECMAScript模块导入。。。from语法

import {exec} from 'child-process-promise';
let result = await exec('echo hi');
console.log(result.stdout);

其他回答

您正在查找child_process.exec

以下是示例:

const exec = require('child_process').exec;
const child = exec('cat *.js bad_file | wc -l',
    (error, stdout, stderr) => {
        console.log(`stdout: ${stdout}`);
        console.log(`stderr: ${stderr}`);
        if (error !== null) {
            console.log(`exec error: ${error}`);
        }
});

使用这个轻量级npm包:系统命令

看看这里。

按如下方式导入:

const system = require('system-commands')

运行以下命令:

system('ls').then(output => {
    console.log(output)
}).catch(error => {
    console.error(error)
})

现在,可以按如下方式使用shelljs(从节点v4):

var shell = require('shelljs');

shell.echo('hello world');
shell.exec('node --version');

使用安装

npm install shelljs

看见https://github.com/shelljs/shelljs

const exec = require("child_process").exec
exec("ls", (error, stdout, stderr) => {
 //do whatever here
})

如果你想要一个与顶级答案非常相似但同时也是同步的答案,那么这将起作用。

var execSync = require('child_process').execSync;
var cmd = "echo 'hello world'";

var options = {
  encoding: 'utf8'
};

console.log(execSync(cmd, options));