Running a shell command from Node.js without buffering output

前端 未结 4 673
傲寒
傲寒 2021-01-30 10:37

I\'m trying to launch a shell command from Node.js, without redirecting that command\'s input and output -- just like shelling out to a command using a shell script, or

相关标签:
4条回答
  • 2021-01-30 10:47

    I haven't used it, but I've seen this library: https://github.com/polotek/procstreams

    It you'd do this. The .out() automatically pipes to the process's stdin/out.

    var $p = require('procstreams');
    $p('cat lines.txt').pipe('wc -l').out();
    

    If doesn't support shell syntax, but that's pretty trivial I think.

    var command_str = "cat lines.txt | wc -l";
    var cmds = command_str.split(/\s?\|\s?/);
    var cmd = $p(cmds.shift());
    while(cmds.length) cmd = cmd.pipe(cmds.shift());
    cmd
      .out()
      .on('exit', function() {
        // Do whatever
      });
    
    0 讨论(0)
  • 2021-01-30 10:53

    There's an example in the node docs for the child_process module:

    Example of detaching a long-running process and redirecting its output to a file:

     var fs = require('fs'),
         spawn = require('child_process').spawn,
         out = fs.openSync('./out.log', 'a'),
         err = fs.openSync('./out.log', 'a');
    
     var child = spawn('prg', [], {
       detached: true,
       stdio: [ 'ignore', out, err ]
     });
    
     child.unref();
    
    0 讨论(0)
  • 2021-01-30 10:59

    You can inherit stdin/out/error streams via spawn argument so you don't need to pipe them manually:

    var spawn = require('child_process').spawn;
    spawn('ls', [], { stdio: 'inherit' });
    

    Use shell for shell syntax - for bash it's -c parameter to read script from string:

    var spawn = require('child_process').spawn;
    var shellSyntaxCommand = 'ls -l | grep test | wc -c';
    spawn('sh', ['-c', shellSyntaxCommand], { stdio: 'inherit' });
    

    To summarise:

    var spawn = require('child_process').spawn;
    function shspawn(command) {
       spawn('sh', ['-c', command], { stdio: 'inherit' });
    } 
    
    shspawn('ls -l | grep test | wc -c');
    
    0 讨论(0)
  • 2021-01-30 11:03

    You can replace exec by spawn and use the shell syntax simply with:

    const {spawn} = require ('child_process');
    const cmd = 'ls -l | grep test | wc -c';
    const p = spawn (cmd, [], {shell: true});
    
    p.stdout.on ('data', (data) => {
      console.log (data.toString ());
    });
    

    The magic is just {shell: true}.

    0 讨论(0)
提交回复
热议问题