【发布时间】:2012-11-19 07:02:24
【问题描述】:
我有一个脚本,我想从另一个脚本运行。问题是子脚本(进程)在继续之前需要用户输入。
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();
});
【问题讨论】:
-
想一想:您是否需要结束
stdin才能让您的脚本做出响应?另见:nodejs.org/api/stream.html#stream_stream_end -
来自文档:通过 end() 关闭此流通常会导致子进程终止。 - nodejs.org/api/child_process.html#child_process_child_stdin 它确实终止了子进程,我可以确认。
标签: node.js stream stdin child-process