如果某些字符串通过管道传输到其 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
如果在 STDIN 上没有任何内容就调用 test.go
,那么事情就会卡在...
bytes, _ := ioutil.ReadAll(os.Stdin)
...等待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")
}
关于go - 检查 Golang 中的 STDIN 是否有需要阅读的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22744443/