我有一个简单的node.js应用程序来返回stdin。当我在Windows控制台上交互式地运行它时,我期望control-Z被识别为EOF信号。但事实并非如此。那么,如何让节点应用程序将control-Z视为EOF呢?
// testEcho.js
process.stdin.setEncoding('utf-8');
console.log("input is a TTY?:",process.stdin.isTTY);
process.stdin.on('readable',function() {
var vText = process.stdin.read();
if (vText != null)
console.log('echo: "%s"',vText);
process.stdout.write('> '); // prompt for next
});
process.stdin.on('end',function() { // Works for redirected input but not triggered by ^Z on TTY
console.log('end of input reached');
});
' ' '
问题是你用的是process.stdin.on
而不是process.on()
看到我在这里做的修复,一切都应该很好,很好:)享受!
process.stdin.setEncoding('utf-8');
console.log("input is a TTY?:", process.stdin.isTTY);
process.stdin.on('readable',function() {
var vText = process.stdin.read();
if (vText != null)
console.log('echo: "%s"',vText);
process.stdout.write('> '); // prompt for next
});
process.on('SIGINT', function () {
console.log('Over and Out!');
process.exit(0);
});
我还用'SIGINT'
代替了'end'
,因为这是CTRL+C
捕获的信号
您可以在这里阅读信号事件:https://nodejs.org/api/process.html#process_signal_events
看来解决方案是使用readline
。这更具有终端感知性,并将交互式TTY ctrl-D视为EOF,同时也正确地处理重定向输入流。此外,由于面向/感知行,它方便地从输入字符串中去掉换行符。
var readline = require('readline');
process.stdin.setEncoding('utf-8');
console.log("input is a TTY?",process.stdin.isTTY);
var rl = readline.createInterface({input: process.stdin, output: process.stdout});
rl.setPrompt('> ');
rl.prompt();
rl.on('line' ,function(aText) { console.log('echo: "%s"',aText); rl.prompt(); });
rl.on('close',function() { console.log('input has closed'); /* ... */ });