【问题标题】:Write to spawned process stdin nodejs?写入生成的进程stdin nodejs?
【发布时间】: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();
});

【问题讨论】:

标签: node.js stream stdin child-process


【解决方案1】:

您可以使用包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); 
})

【讨论】:

  • 我的子脚本似乎有问题,因为它也不适用于 suppose。我在我的子脚本中使用 commander.js 来提示用户采取行动。也许这在某种程度上是问题..
  • 我在第一个提示中缺少一个尾随空格字符,但我猜这是 commander.js 特有的。无论如何,您的模块对我有用,所以我会标记您的答案。
猜你喜欢
  • 2017-05-07
  • 2015-12-02
  • 1970-01-01
  • 1970-01-01
  • 2018-01-21
  • 2011-12-25
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多