Tôi có một tập lệnh mà tôi muốn chạy từ một tập lệnh khác. Vấn đề là kịch bản con (quá trình) cần một đầu vào của người dùng trước khi nó tiếp tục.Ghi vào các nút stdin nodejs đã sinh ra?
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');
});
Sau khi tôi nhập dữ liệu, tập lệnh con sẽ tiếp tục nhưng thay vào đó hãy nhập vào đó.
Giải pháp
Thực tế mã ở trên phù hợp với tôi. Tôi đang sử dụng commander.js trong tập lệnh con để nhắc người dùng thực hiện hành động. Dưới đây là cách tôi phản ứng với dấu nhắc kịch bản của một đứa trẻ:
child.stdout.on('data', function (data) {
switch (data.toString().trim()) {
case 'Username:':
child.stdin.write('user');
break;
case 'Password:':
child.stdin.write('pass');
break;
}
});
Cùng một điều làm việc với 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();
});
Chỉ cần một ý nghĩ: làm bạn cần phải chấm dứt 'stdin' để cho kịch bản của bạn để trả lời? Xem thêm: http://nodejs.org/api/stream.html#stream_stream_end – skeggse
Từ tài liệu: Đóng luồng này qua cuối() thường làm cho quá trình con chấm dứt. - http://nodejs.org/api/child_process.html#child_process_child_stdin Và nó chấm dứt quá trình con tôi có thể xác nhận nó. – simo