英文:
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")
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论