我正在尝试运行子进程来修改文件(分两步),然后再从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 `('
在节点中执行此操作的正确方法是什么?
答案 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'});