2016-12-17 11 views
0

У меня есть скрипт в виде строки, которую я хотел бы выполнить в дочернем процессе Node.js.Использовать child_process # spawn с общей строкой

Данные выглядит следующим образом:

const script = { 
    str: 'cd bar && fee fi fo fum', 
    interpreter: 'zsh' 
}; 

Обычно, я мог бы использовать

const exec = [script.str,'|',script.interpreter].join(' '); 

const cp = require('child_process'); 
cp.exec(exec, function(err,stdout,sterr){}); 

однако cp.exec буферы стандартный вывод/STDERR, и я хотел бы иметь возможность быть в состоянии потока stdout/stderr в любом месте.

Кто-нибудь знает, есть ли способ использовать cp.spawn в некотором роде с помощью строки generic, таким же образом вы можете использовать cp.exec? Я хотел бы избежать записи строки во временный файл, а затем выполнить файл с помощью cp.spawn.

cp.spawn будет работать со строкой, но только в том случае, если он имеет предсказуемый формат - это для библиотеки, поэтому он должен быть чрезвычайно общим.

... Я просто подумал о чем-то, я предполагаю, что лучший способ сделать это:

const n = cp.spawn(script.interpreter); 
n.stdin.write(script.str); // <<< key part 

n.stdout.setEncoding('utf8'); 

n.stdout.pipe(fs.createWriteStream('./wherever')); 

Я постараюсь, что, но, может быть, у кого-то есть идея получше.

downvoter: вы бесполезны

+0

OMG смешной downvote спасибо –

ответ

0

Хорошо, понял это.

Я использовал ответ от этого вопроса: Nodejs Child Process: write to stdin from an already initialised process

Следующая позволяет кормить общую строку в дочерний процесс, с различными переводчиками оболочки, следующий использует zsh, но вы можете использовать bash или sh или независимо от исполняемого файла.

const cp = require('child_process'); 

const n = cp.spawn('zsh'); 

n.stdin.setEncoding('utf8'); 
n.stdin.write('echo "bar"\n'); // <<< key part, you must use newline char 

n.stdout.setEncoding('utf8'); 

n.stdout.on('data', function(d){ 
    console.log('data => ', d); 
}); 

Использование Node.js, это примерно то же самое, но, кажется, что мне нужно использовать один дополнительный вызов, то есть n.stdin.end(), например, так:

const cp = require('child_process'); 

const n = cp.spawn('node').on('error', function(e){ 
    console.error(e.stack || e); 
}); 

n.stdin.setEncoding('utf-8'); 
n.stdin.write("\n console.log(require('util').inspect({zim:'zam'}));\n\n"); // <<< key part 

n.stdin.end(); /// seems necessary to call .end() 

n.stdout.setEncoding('utf8'); 

n.stdout.on('data', function(d){ 
    console.log('data => ', d); 
}); 

 Смежные вопросы

  • Нет связанных вопросов^_^