进程替换 - Node.js child_process

时间:2013-07-25 14:07:19

标签: node.js bash pipe child-process process-substitution

我正在尝试运行子进程来修改文件(分两步),然后再从stdout读取修改后的内容。 我试图通过使用进程替换来做到这一点,它在bash中完美运行,但是当我从节点尝试时却没有。

这就是命令的样子......

var p = exec('command2 <(capture /dev/stdout | command1 -i file -) -',
function (error, stdout, stderr) {
   console.log(stderr);
});

stderr print:

/bin/sh: -c: line 0: syntax error near unexpected token `('

在节点中执行此操作的正确方法是什么?

4 个答案:

答案 0 :(得分:3)

我通过将命令放在shell脚本中并从节点子进程调用脚本来解决这个问题。 我还需要添加以下内容以在posix模式下设置bash以允许进程替换:

set +o posix

可能有更好的方法直接从节点内执行此操作,但它完成了这项工作。 干杯!

答案 1 :(得分:1)

您可以通过调用带有spawn标记的child_process命令,在节点中使用bash替换sh -c {/ 1}}。

sh命令使用您的默认bash解释器,-c标志要求解释器从字符串中读取命令,即$(echo $PATH)。然后将其他标志传递给它们的正常位置引用,例如:$0$1,等等。

一个例子可能是:

const spawn = require('child_process').spawn;

const prg = 'sh',

    args = [
        '-c',
        'echo $($0 $1)',
        'ls', // $0
        '-la' // $1
    ],

    opts = {
        stdio: 'inherit'
    };

// Print a directory listing, Eg: 'ls -la'
const child = spawn(prg, args, opts);

答案 2 :(得分:0)

您可以使用bash -c 'command' bash评估命令。我已对此进行了测试,它适用于进程替换和child_process。

答案 3 :(得分:0)

这是由以/bin/sh调用的posix模式下运行bash引起的。

直接从/bin/bash调用bash可以避免这种情况:

child_process.execSync('diff <(curl a) <(curl b)', {shell: '/bin/bash'});