4

在从标准输出读取修改后的内容之前,我正在尝试运行一个子进程来修改文件(分两步)。我正在尝试通过使用进程替换来做到这一点,该进程替换在 bash 中完美运行,但当我从节点尝试时却不行。

这有点像命令的样子..

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 `('

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

4

4 回答 4

3

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

set +o posix

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

于 2013-07-26T10:07:20.213 回答
2

这是由 bash 在以 posix 模式调用时以/bin/sh.

直接调用 bash/bin/bash可以避免:

child_process.execSync('diff <(curl a) <(curl b)', {shell: '/bin/bash'});
于 2018-08-31T11:49:10.110 回答
1

您可以通过调用spawn带有标志的命令child_process在 Node 中使用 bash 替换。sh-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);
于 2017-01-11T22:10:40.670 回答
0

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

于 2013-08-13T21:08:20.343 回答