检查 Golang 的 STDIN 上是否有可阅读的内容

如果某些字符串通过管道传输到其 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。


我需要做什么才能让这一切顺利进行?


PIPIONE
浏览 233回答 3
3回答

12345678_0001

我通过使用 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")}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go