2016-09-04 2 views
3

Я работаю над приложением nodejs, и мне нужно передать многострочную строку в команду оболочки. Я не профессионал в сценарии оболочки, но если я запускаю эту команду в моем терминале работает просто отлично:Проведите переменную javascript в команде оболочки с nodejs

$((cat $filePath) | dayone new)

Вот что у меня есть на стороне nodejs. Команда dayone работает, но в ней нет ничего.

const cp = require('child_process'); 
const terminal = cp.spawn('bash'); 

var multiLineVariable = 'Multi\nline\nstring'; 

terminal.stdin.write('mul'); 
cp.exec('dayone new', (error, stdout, stderr) => { 
    console.log(error, stdout, stderr); 
}); 
terminal.stdin.end(); 

Благодарим за помощь!

ответ

1

Здесь вы запускаете bash, используя spawn, но затем вы используете exec для запуска вашей дневной программы. Они являются отдельными дочерними процессами и никоим образом не связаны.

«cp» - это просто ссылка на модуль child_process, а spawn и exec - всего лишь два разных способа запуска дочерних процессов.

Вы можете использовать bash и написать команду dayone для stdin, чтобы вызывать dayone (как кажется, ваш фрагмент пытается сделать), или вы можете просто вызвать dayone непосредственно с exec (помните, что exec все еще выполняет команду в оболочке):

var multiLineVariable = 'Multi\nline\nstring'; 

// get the child_process module 
const cp = require('child_process'); 

// open a child process 
var process = cp.exec('dayone new', (error, stdout, stderr) => { 
    console.log(error, stdout, stderr); 
}); 

// write your multiline variable to the child process 
process.stdin.write(multiLineVariable); 
process.stdin.end(); 
+0

Это работает отлично, но я не уверен, почему. Кажется, что вызов 'cp.exec', прежде чем мы напишем в' stdin', выполнит команду 'dayone', прежде чем что-нибудь будет читать. Можете ли вы объяснить, как команда 'dayone' получает вход? Благодаря! – danseethaler

+1

Команда exec не будет ждать завершения/выхода dayone, поскольку ничего в блоках node.js не будет. Exec только начинает процесс, и процесс затем пытается прочитать из stdin. Если нет ничего доступного, он будет блокироваться до тех пор, пока не появится что-то, что будет, как мы это делаем, как только мы начнем процесс. Точно так же, как если бы вы запускали его из командной строки вручную, он блокируется, пока вы не набрали что-то в его stdin. –

+0

Отлично! Спасибо! – danseethaler

0

с Readable Streams это очень легко слушать вход

const chunks = []; 
process.stdin.on('readable',() => { 
    const chunk = process.stdin.read() 
    chunks.push(chunk); 
    if (chunk !== null) { 
    const result = Buffer.concat(chunks); 
    console.log(result.toString()); 
    } 
}); 

с Writable Streams вы можете написать в стандартный вывод

process.stdout.write('Multi\nline\nstring'); 

Надеюсь, я смогу вам помочь

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