Go语言 检测命令是否通过管道传输

v440hwme  于 2022-12-16  发布在  Go
关注(0)|答案(2)|浏览(132)

有没有办法检测go中的命令是否通过管道传输?
示例:

cat test.txt | mygocommand #Piped, this is how it should be used
mygocommand # Not piped, this should be blocked

我正在阅读标准输入reader := bufio.NewReader(os.Stdin)

5tmbdcev

5tmbdcev1#

使用os.Stdin.Stat()

package main

import (
  "fmt"
  "os"
)

func main() {
    fi, _ := os.Stdin.Stat()

    if (fi.Mode() & os.ModeCharDevice) == 0 {
        fmt.Println("data is from pipe")
    } else {
        fmt.Println("data is from terminal")
    }
}

(改编自this tutorial

oxf4rvwz

oxf4rvwz2#

对ModeNamedPipe执行类似的逐位操作也可以实现同样的效果

package main

import (
        "fmt"
        "os"
)

func main() {
        fi, err := os.Stdin.Stat()
        if err != nil {
                panic(err)
        }

        if (fi.Mode() & os.ModeNamedPipe) != 0 {
                fmt.Println("data is from pipe")
        } else {
                fmt.Println("data is from terminal")
        }
}

相关问题