如何在Node中获取当前TTY设备?

w8biq8rn  于 2023-04-05  发布在  Node.js
关注(0)|答案(2)|浏览(153)

我正在尝试获取当前TTY/PTY的设备路径。
如果我在shell中运行tty,它会告诉我当前TTY的设备,但如果我使用child_process运行tty,我会得到一个错误。我也尝试过fs.readlinkSync('/proc/self/fd/0'),但它也不起作用。
我尝试过的:

luis@Iphone-47 ~ % tty
/dev/ttys003
luis@Iphone-47 ~ % node
Welcome to Node.js v19.7.0.
Type ".help" for more information.
> const cp = require('child_process')
undefined
> try { cp.execSync('tty') } catch (err) { console.log(err.stdout.toString()) }
not a tty

undefined
>

有没有跨平台的方法可以做到这一点?

**编辑:**这在Python中有效,为什么在Node中不行?

luis@Iphone-47 ~ % python3
Python 3.9.1 (v3.9.1:1e5d33e9b9, Dec  7 2020, 12:10:52) 
[Clang 6.0 (clang-600.0.57)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.system('tty')
/dev/ttys001
0
>>>
20jt8wwn

20jt8wwn1#

您可以使用tty模块,它提供了一种跨平台的方式来访问终端相关功能。尽管如此,tty仅在Node.js中可用,而在浏览器环境中不可用。

const tty = require('tty');

const { path } = tty;

console.log(path);

如果path不可用,则使用tty模块的isatty函数检查文件描述符是否与终端设备关联。

const tty = require('tty');
const fs = require('fs');

function getCurrentTTYPath() {
  if (tty.isatty(0)) {
    return fs.realpathSync('/dev/tty');
  }
  return null;
}

const ttyPath = getCurrentTTYPath();

console.log(ttyPath);

这个简单的方法是使用isatty函数检查stdin的文件描述符是否与终端设备相关联。如果是,则使用fs. realpathSync返回/dev/tty设备的路径。如果不是,则返回null。希望对您有所帮助。

idfiyjo8

idfiyjo82#

好的,我阅读完a very long issue on GitHub后就想明白了。
技巧是设置stdio继承stdin,并管道stdoutstderr

const cp = require('child_process');

const ttyPath = cp.execSync('tty', {
  stdio: [
    'inherit',
    'pipe',
    'pipe'
  ]
}).toString().trim();

相关问题