首页 > 后端开发 > Golang > 如何检测 Go 的 STDIN 输入是来自管道还是终端?

如何检测 Go 的 STDIN 输入是来自管道还是终端?

Mary-Kate Olsen
发布: 2024-12-15 10:26:15
原创
501 人浏览过

How Can I Detect if Go's STDIN Input is from a Pipe or a Terminal?

在 Go 中检测 STDIN 数据可用性

在代码中,您的目标是区分数据何时通过管道传输到 STDIN 以及何时执行从终端。挑战在于解决 ioutil.ReadAll() 的阻塞性质,当 STDIN 为空时,它会无限期地等待输入。

解决方案:使用 os.ModeCharDevice

为了解决这个问题,我们可以利用 os.ModeCharDevice 来确定 STDIN 是否与终端或管道关联。操作方法如下:

package main

import (
    "fmt"
    "os"
)

func main() {
    stat, _ := os.Stdin.Stat()
    if (stat.Mode() & os.ModeCharDevice) == 0 {
        fmt.Println("data is being piped to stdin")
    } else {
        fmt.Println("stdin is from a terminal")
    }
}
登录后复制

说明:

  • stat, _ := os.Stdin.Stat():检索 STDIN 的文件信息。
  • if (stat.Mode() & os.ModeCharDevice) == 0:检查 STDIN 文件模式是否未设置 os.ModeCharDevice 位。

    • 如果 STDIN 是管道,则其模式通常不是设置了 os.ModeCharDevice 位。
    • 如果 STDIN 是终端,其模式通常会有 os.ModeCharDevice 位
  • 根据此检查,程序会打印相应的消息,指示数据是否通过管道传输到 STDIN,或者是否从终端执行。

以上是如何检测 Go 的 STDIN 输入是来自管道还是终端?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板