如何在 Node.JS 中获取生成的 child_process 的输出?

Posted

技术标签:

【中文标题】如何在 Node.JS 中获取生成的 child_process 的输出?【英文标题】:How to get the output of a spawned child_process in Node.JS? 【发布时间】:2016-08-24 09:40:28 【问题描述】:

首先,我是一个完全的菜鸟,昨天开始使用 Node.JS(这也是我多年来第一次使用 Linux)所以请保持友好和明确

我目前正在制作一个 Node.JS 程序,除其他外,它必须启动 shell 命令(主要是:安装 USB 驱动器)。 我目前正在使用

var spawn = require('child_process').spawnSync;

function shspawn(command) 
    spawn('sh', ['-c', command],  stdio: 'inherit' );


shspawn('echo Hello world');
shspawn('mkdir newdir');

等等。这对我来说是一种非常舒适的方式。 问题是我想将例如“ls”命令的输出存储在一个变量中,就像

var result = shspawn('ls -l')

我在网上阅读了一些示例,但他们很少使用 spawn,当他们这样做时,它对我不起作用(我想我可能做错了什么,但我还是 Node 中的菜鸟)

如果你们有比使用 child_process_spawnSync 更好的想法,我愿意接受任何想法,但我希望尽可能保持我的程序无包 :)

编辑:我需要它同步工作!这就是我开始使用 spawnSync 的原因。我将使用一些命令,例如 dd,这需要时间并且需要在程序转到另一个命令之前完全完成。

【问题讨论】:

【参考方案1】:

你可以像下面那样做。

    var spawn = require('child_process').spawn;
    // Create a child process
    var child = spawn('ls' , ['-l']);

    child.stdout.on('data',
        function (data) 
            console.log('ls command output: ' + data);
        );
    child.stderr.on('data', function (data) 
        //throw errors
        console.log('stderr: ' + data);
    );

    child.on('close', function (code) 
        console.log('child process exited with code ' + code);
    );

更新:使用 spawnSync

    var spawn = require('child_process').spawnSync;
    var child = spawn('ls' , ['-l','/usr']);
    console.log('stdout here: \n' + child.stdout);

【讨论】:

它给了我这个错误:child.stdout.on('data', function (data) console.log('ls command output: ' + data); ); ^ TypeError: Cannot read property 'on' of null 用微小的变化编辑了答案,它似乎对我有用。再试一次。我正在使用节点版本v4.2.4 BTW。 它适用于 spawn,谢谢 :) 但我需要它与 spawnSync 一起使用,因为我想等待每个命令结束后再转到另一个命令。到目前为止,我有一个执行命令的工作函数,但 NodeJS 甚至在命令能够返回任何内容之前就在程序中继续运行。 它对我有用,谢谢! :) 我已经设置了这个运行良好的代码:function command(txt) var words = txt.trim().split(" "); var child = spawn(words[0] , words.splice(1, words.length)); return('' + child.stdout); 你知道我怎样才能让它也适用于管道吗?就像在这一行:grep sh | ls -l 编辑:对不起,代码不缩进时看起来很糟糕

以上是关于如何在 Node.JS 中获取生成的 child_process 的输出?的主要内容,如果未能解决你的问题,请参考以下文章

Node.js 生成子进程并实时获取终端输出

在 node.js 中使用参数生成过程

Node.js 捕获生成后引发的 ENOMEM 错误

node.js -- 同步执行命令并获取结果

如何模拟 Node.js child_process spawn 函数?

我如何从child_process.execFile获得结果?