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)
.
You can do this using 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 https://www.socketloop.com/tutorials/golang-check-if-os-stdin-input-data-is-piped-or-from-terminal)
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")
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With