2012-12-01 29 views
14

我有一个脚本,我想从另一个运行。问题在于,子脚本(进程)在继续之前需要用户输入。写入产生的进程stdin nodejs?

var child = spawn('script'); 
child.stdin.setEncoding('utf8'); 
child.stdout.on('data', function (data) { 
    console.log(data.toString().trim()); // tells me to input my data 
    child.stdin.write('my data\n'); 
}); 

输入我的数据后,子脚本应该继续,但是它会挂在那里。

解决方案

其实上面的代码适合我。我在子脚本中使用commander.js来提示用户采取行动。这里是我的孩子的脚本提示做出响应:

child.stdout.on('data', function (data) { 
    switch (data.toString().trim()) { 
     case 'Username:': 
      child.stdin.write('user'); 
      break; 
     case 'Password:': 
      child.stdin.write('pass'); 
      break; 
    } 
}); 

同样的事情,工作,suppose

var suppose = require('suppose'); 

suppose('script') 
    .on('Username: ').respond('user') 
    .on('Password: ').respond('pass') 
.error(function (err) { 
    console.log(err.message); 
}) 
.end(function (code) { 
    console.log(code); 
    done(); 
}); 
+0

只是一个想法:你需要结束'stdin'为了你的脚本回应?另请参见:http://nodejs.org/api/stream.html#stream_stream_end – skeggse

+0

从文档:通过end()关闭此流通常会导致子进程终止。 - http://nodejs.org/api/child_process.html#child_process_child_stdin 它终止子进程,我可以确认它。 – simo

回答

11

你可以使用包suppose。这就像Unix Expect。充分披露,我是作者。

从GitHub的页面上的例子,你可以看到它的一个示例脚本NPM:https://github.com/jprichardson/node-suppose

例子:

var suppose = require('suppose') 
suppose('script') 
.on(/\w*/).respond('my data\n') 
.end(function(code){ 
    console.log('Done: ' + code); 
}) 
+0

我的子脚本似乎存在一些问题,因为它不适用于* suppose *。我在我的子脚本中使用* commander.js *来提示用户采取行动。也许这是在某种程度上的问题.. – simo

+0

我错过了第一个提示中的一个尾随空白字符,但我想这是* commander.js *特定的东西。无论如何,你的模块为我工作,所以我会标记你的答案。 – simo