进程替换 - Node.js子进程模块

4
我正在尝试运行一个子进程来修改文件(分两步),然后从stdout读取修改后的内容。我正在尝试使用进程替换,它在bash中完美地运行,但在从node尝试时不起作用。
这是命令的样子。
var p = exec('command2 <(capture /dev/stdout | command1 -i file -) -',
function (error, stdout, stderr) {
   console.log(stderr);
});

标准错误输出:

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

在Node中,如何正确地做到这一点?
4个回答

3

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

set +o posix

可能有更好的直接从Node中完成此操作的方法,但这样做已经完成了任务。 干杯!


2

这是由于在作为/bin/sh调用时,bash以posix模式运行。

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

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

1
你可以通过在Node中使用带有bash替换的sh命令来spawn一个child_process,并使用-c标志调用它。 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);

0

你可以使用 bash -c 'command' 让 bash 执行一个命令。我已经测试过,它可以与进程替换和 child_process 一起使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接