【问题标题】:How to get the output of a spawned child_process in Node.JS?如何在 Node.JS 中获取生成的 child_process 的输出?
【发布时间】: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,这需要时间并且需要在程序转到另一个命令之前完全完成。

【问题讨论】:

    标签: node.js shell output child-process spawn


    【解决方案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 编辑:对不起,代码不缩进时看起来很糟糕
    猜你喜欢
    • 1970-01-01
    • 2014-07-05
    • 2019-12-18
    • 1970-01-01
    • 2012-01-24
    • 2020-12-12
    • 1970-01-01
    • 2014-02-06
    • 1970-01-01
    相关资源
    最近更新 更多