如何从控制台向node.js stdin发送EOF信号?

时间:2015-06-03 05:59:20

标签: javascript node.js

我有一个简单的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');
    });

```

2 个答案:

答案 0 :(得分:4)

问题是您使用的是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);
});

此外,我将'end'替换为'SIGINT',因为这是CTRL+C

捕获的信号

您可以在此处阅读有关信号事件:https://nodejs.org/api/process.html#process_signal_events

答案 1 :(得分:3)

似乎解决方案是使用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'); /* ... */ });