一尘不染

检查在Golang的STDIN上是否有需要阅读的内容

go

如果某些字符串通过管道传递到其STDIN,则我需要一个命令行实用程序来表现不同。这是一些最小的示例:

package main // file test.go

import (
    "fmt"
    "io/ioutil"
    "os"
)

func main() {
    bytes, _ := ioutil.ReadAll(os.Stdin)

    if len(bytes) > 0 {
        fmt.Println("Something on STDIN: " + string(bytes))
    } else {
        fmt.Println("Nothing on STDIN")
    }
}

如果您这样称呼它,效果很好:

echo foo | go run test.go

如果test.go没有在STDIN上调用任何东西,那么事情就卡在了…

bytes, _ := ioutil.ReadAll(os.Stdin)

…等待EOF

我需要怎么做才能做到这一点?

提前致谢!


阅读 234

收藏
2020-07-02

共1个答案

一尘不染

我通过使用os.ModeCharDevice解决了这个问题:

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")
}
2020-07-02