检测一个命令是否使用了管道。

huangapple go评论96阅读模式
英文:

Detect if a command is piped or not

问题

有没有办法检测Go语言中的命令是否被管道传输?

示例:

cat test.txt | mygocommand # 被管道传输,应该这样使用
mygocommand # 没有被管道传输,应该被阻止

我正在使用reader := bufio.NewReader(os.Stdin)从标准输入读取。

英文:

Is there a way to detect if a command in go is piped or not?

Example:

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

I'm reading from the Stdin reader := bufio.NewReader(os.Stdin).

答案1

得分: 22

使用os.Stdin.Stat()

package main

import (
  "fmt"
  "os"
)

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

    if (fi.Mode() & os.ModeCharDevice) == 0 {
        fmt.Println("数据来自管道")
    } else {
        fmt.Println("数据来自终端")
    }
}

(改编自这个教程

英文:

Use 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")
    }
}

(Adapted from this tutorial)

答案2

得分: 1

可以使用类似的位运算操作来执行与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("数据来自管道")
	} else {
		fmt.Println("数据来自终端")
	}
}

这段代码的作用是判断输入数据是来自管道还是终端。如果数据来自管道,则输出"数据来自管道";如果数据来自终端,则输出"数据来自终端"。

英文:

same can be done with performing a similar bitwise operation with 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")
        }
}

huangapple
  • 本文由 发表于 2017年5月13日 06:37:02
  • 转载请务必保留本文链接:https://go.coder-hub.com/43947363.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定