如果某些字符串通过管道传递到其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上调用任何东西,那么事情就卡在了…
test.go
bytes, _ := ioutil.ReadAll(os.Stdin)
…等待EOF。
EOF
我需要怎么做才能做到这一点?
提前致谢!
我通过使用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") }