检测STDIN上是否有某些内容

时间:2017-03-04 23:31:47

标签: go terminal pipe stdin

计划应该能够在终端上从stdin获取输入,如下所示:

echo foobar | program

但是,在程序的下面的源代码中,如果省略管道,则stdin读取阻止:

package main

import (
    "fmt"
    "os"
)

func main() {
    b := make([]byte, 1024)
    r := os.Stdin
    n, e := r.Read(b)
    if e != nil {
        fmt.Printf("Err: %s\n", e)
    }
    fmt.Printf("Res: %s (%d)\n", b, n)

}

那么程序如何检测是否以这种方式通过管道传输某些内容,如果不是,则继续执行而不是阻止?

......这样做是个好主意吗?

2 个答案:

答案 0 :(得分:1)

os.Stdin被视为文件并具有权限。当os.Stdin打开时,权限为0600,关闭后0620

此代码有效:

package main

import (
    "fmt"
    "os"
)

func main() {
    stat, _ := os.Stdin.Stat()
    fmt.Printf("stdin mode: %v\n", stat.Mode().Perm())
    if stat.Mode().Perm() == 0600 {
        fmt.Printf("stdin open\n")
        return
    }
    fmt.Printf("stdin close\n")

}

答案 1 :(得分:0)

如果你把读取放在goroutine中并使用select来从main中的通道进行非阻塞读取,那么你可能会有一个竞争条件,你可以根据数据是否得到不同的结果进来得很快。您尝试解决的问题是什么?