如何检测 Node 的 process.stdout 是不是正在通过管道传输?

Posted

技术标签:

【中文标题】如何检测 Node 的 process.stdout 是不是正在通过管道传输?【英文标题】:How to detect if Node's process.stdout is being piped?如何检测 Node 的 process.stdout 是否正在通过管道传输? 【发布时间】:2014-01-02 08:33:46 【问题描述】:

有什么方法可以检测我的 Node.js 脚本的输出是否正在通过管道传输到终端以外的其他东西?

我想要一些方法来检测是否发生这种情况:

node myscript.js | less

或者如果发生这种情况:

node myscript.js

【问题讨论】:

为什么不从节点处理这个?传递命令行参数以将其发送到更少。它的灵活性要低得多,但是如果您想知道它是通过管道传输的,那么无论如何您都会失去这种灵活性。 【参考方案1】:

最简单的方法是process.stdout.isTTY (0.8 +):

$ node -p -e "Boolean(process.stdout.isTTY)"
true
$ node -p -e "Boolean(process.stdout.isTTY)" | cat
false

(来自官方文档的示例)

您也可以使用tty module 进行更精细的控制:

if (require('tty').isatty(1)) 
    // terminal

【讨论】:

@damphat 如果它不能在 Windows 上运行,那就太奇怪了 :) 它实际上只是 delegates to libuv 到 uv_get_handle,它只是在 /src/win/(Windows 处理逻辑)下运行在handle.c 中in turn 只是调用GetConsoleMode :)【参考方案2】:

您可以通过查看其文件描述符指向的位置来检查正在运行的进程的标准输出是否通过管道传输,例如如下所示

readlink /proc/<your process id>/fd/1

或者,更具体地说

[[ $(readlink /proc/$(pgrep -f 'node myscript.js')/fd/1) =~ ^pipe ]] && echo piped

【讨论】:

以上是关于如何检测 Node 的 process.stdout 是不是正在通过管道传输?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 Node.js 中的文本中检测地址

如何配置 ar 无人机以使用 node.js 检测标签?

如何检测 HDMI 设备是不是与 Node JS 连接?

如何检测HDMI设备是否与Node JS连接?

如何从 node.js 应用程序检测损坏/不完整的 MP3 文件?

如何在Node.js中检测键序列以执行某些操作