【问题标题】:Piping shell script through bash using node.js使用 node.js 通过 bash 管道 shell 脚本
【发布时间】:2019-05-14 07:20:48
【问题描述】:

说我有这个:

const cp = require('child_process');

fs.createReadStream(__dirname + '/dummy.sh')
  .pipe(cp.spawn('bash').stdin).on('data', d => {
  console.log('data:', d);
});

而 dummy.sh 仅包含 echo "this is dummy",无论出于何种原因,on data 回调中都没有数据通过。有谁知道为什么会这样?我希望这个输出data: this is dummy

【问题讨论】:

    标签: node.js bash shell


    【解决方案1】:

    您没有在监听 bash 命令的输出。
    on('data') 事件处理程序不会触发您的 bash 脚本输出。

    相反,你应该听进程stdout

    const fs = require('fs');
    const cp = require('child_process');
    
    let cmd = cp.spawn('bash');
    fs.createReadStream(__dirname + '/dummy.sh')
        .pipe(cmd.stdin).pipe(cmd.stdout).on('data', d => {
      console.log('data:', d.toString());  // data: this is dummy
    });
    

    【讨论】:

    • 是的,我猜.pipe(cmd.stdin) 会返回cmd.stdout,对吧?
    • 不,pipe() 本身不会调用生成的进程输出。在这种情况下,它传输cmd.stdin 输出,逻辑上不包含任何内容。为了确定这一点,您可以尝试使用和不使用cmd.stdout 链接.pipe(fs.createWriteStream('out.txt'))