在 RingoJS 中有一个函数调用read
它允许你读取整个流直到到达末尾。这在您制作命令行应用程序时很有用。例如,您可以编写如下tac
程序:
#!/usr/bin/env ringo
var string = system.stdin.read(); // read the entire input stream
var lines = string.split("\n"); // split the lines
lines.reverse(); // reverse the lines
var reversed = lines.join("\n"); // join the reversed lines
system.stdout.write(reversed); // write the reversed lines
这允许您启动 shell 并运行tac
命令。然后,您可以根据需要输入任意数量的行,完成后您可以按Ctrl+ D(或Windows 上的 +)表示Ctrl传输结束。Z
我想在 node.js 中做同样的事情,但我找不到任何可以这样做的函数。我想使用库中的readSync
函数来fs
模拟如下,但无济于事:
fs.readSync(0, buffer, 0, buffer.length, null);
stdin的文件描述符(第一个参数)是0
. 所以它应该从键盘读取数据。相反,它给了我以下错误:
Error: ESPIPE, invalid seek
at Object.fs.readSync (fs.js:381:19)
at repl:1:4
at REPLServer.self.eval (repl.js:109:21)
at rli.on.self.bufferedCmd (repl.js:258:20)
at REPLServer.self.eval (repl.js:116:5)
at Interface.<anonymous> (repl.js:248:12)
at Interface.EventEmitter.emit (events.js:96:17)
at Interface._onLine (readline.js:200:10)
at Interface._line (readline.js:518:8)
at Interface._ttyWrite (readline.js:736:14)
您将如何同步收集输入文本流中的所有数据并将其作为字符串在 node.js 中返回?一个代码示例将非常有帮助。