【问题标题】:Querying Primary Device Attributes查询主设备属性
【发布时间】:2020-07-23 10:18:42
【问题描述】:

我正在尝试使用 Primary Device Attributes ANSI escape code 在 Node.js 中查询 sixel 支持,但我找不到捕获终端响应的方法。

在Linux环境下,就这么简单

echo -e '\e[0c'

但是,在 Node.js 中执行命令并捕获其标准输入回复似乎比听起来更难。

由于并非所有操作系统和环境都支持 -e 选项,因此我需要创建一个以不同方式执行此操作的 Node.js 实现。

我首先尝试使用readline:

const readline = require("readline")

const ESC = '\u001B[';

const askText = prompt => new Promise((resolve) => {
    const rl = readline.createInterface(process.stdin, process.stdout)
    rl.question(prompt, (answer) => {
        resolve(answer)
        rl.close()
    })
})

askText(ESC + "0c").then(console.log)

但这只是显示一个提示并等待用户按回车。

我也尝试过流式传输并记录它无济于事

const readline = require("readline")
const toReadableStream = require("to-readable-stream")
const wstream = require("fs").createWriteStream("a.txt")

const rl = readline.createInterface({
    input: toReadableStream(code), output: wstream
})

rl.on("line", (line) => {
    console.log(`Received: ${JSON.stringify(line)}`);
})

我也使用child_process.exec 进行了调查,但据我所知它不支持标准输入。

我应该怎么做呢?

【问题讨论】:

  • 更合适的是exec
  • @Molda 如何从 exec 调用中获取结果标准输入?
  • 您必须使用 require('tty') 并将 tty 临时设置为原始模式。在原始模式下,请求 DA 并读取响应,然后再次离开原始模式。
  • require('child_process').exec("echo -e '\e[0c'", (err, stdout, stderr) => { console.log(stdout)}) 但我不确定命令应该返回什么。此外,您可能需要转义'\e',我的意思是使用双反斜杠。它在 Windows 上的 ubuntu 中返回 1;0c。
  • @Molda 来自问题:由于并非所有操作系统和环境都支持 -e 选项,因此我需要创建一个以不同方式执行此操作的 Node.js 实现。

标签: javascript node.js terminal


【解决方案1】:

这是一个简单的解决方案(@jerch 建议):

const ESC = "\u001B["

stdin.setEncoding("utf8")
stdin.setRawMode(true)

stdin.once("data", data => {
    // Handle resulting data...
    stdin.setRawMode(false)
    stdin.destroy()
})

stdout.write(ESC + '0c')

【讨论】:

  • 恕我直言,当使用childprocess.spawn 从子进程调用并继承 std 流时,这也应该起作用(我希望 nodejs 不会将它们变成管道,而只是转发 fds)。但请注意,子进程必须在前台组中,否则对 TTY 的读/写访问可能会变得很奇怪。此外,暂时将 TTY 切换到原始模式可能会混淆其他进程(例如,主 nodejs 进程在输入时使用readline 模块进行侦听)。所以这需要一些测试才能正常工作......
猜你喜欢
  • 2019-01-26
  • 1970-01-01
  • 1970-01-01
  • 2014-11-23
  • 1970-01-01
  • 2020-08-20
  • 1970-01-01
  • 2013-05-22
  • 1970-01-01
相关资源
最近更新 更多