2012-12-01 44 views
14

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(); 
}); 
+0

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

+0

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

Trả lời

11

Bạn có thể sử dụng gói suppose. Nó giống như Unix Expect. Tiết lộ đầy đủ, tôi là tác giả.

Từ ví dụ trên trang Github, bạn có thể xem ví dụ về nó kịch bản NPM: https://github.com/jprichardson/node-suppose

Ví dụ:

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

Có vẻ như có một số vấn đề với kịch bản con của tôi vì nó không hoạt động với * giả sử *. 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. Có lẽ đây là vấn đề một cách nào đó .. – simo

+0

Tôi đã bỏ lỡ một ký tự khoảng trống màu trắng trong dấu nhắc đầu tiên nhưng tôi đoán đây là một cái gì đó cụ thể cho * commander.js *. Dù sao mô-đun của bạn làm việc cho tôi vì vậy tôi sẽ đánh dấu câu trả lời của bạn. – simo