Piping Commands in Go Using Exec Package
Piping commands in Go can be achieved using the os/exec package. However, when attempting to pipe the output of one command into another, difficulties might arise. This article addresses such challenges and provides a solution.
Consider the following command that pipes the stdout from phantomjs into ffmpeg to create a video from captured images:
phantomjs runner.js | ffmpeg -y -c:v png -f image2pipe -r 25 -t 10 -i - -c:v libx264 -pix_fmt yuv420p -movflags +faststart dragon.mp4
Issue:
Executing this command with exec.Command(parts[0], parts[1:]...), where parts represents the command components, does not honor the pipe.
Solution:
To effectively pipe the output, employ the following approach:
Use exec.Command("bash", "-c", command) to execute the command as a bash script, where command is the desired piped command. This method handles pipes transparently.
Example:
import ( "fmt" "os/exec" ) func main() { cmd := "phantomjs runner.js | ffmpeg -y -c:v png -f image2pipe -r 25 -t 10 -i - -c:v libx264 -pix_fmt yuv420p -movflags +faststart dragon.mp4" output, err := exec.Command("bash", "-c", cmd).Output() if err != nil { fmt.Printf("Failed to execute command: %s", cmd) } fmt.Println(string(output)) }
By executing the command as a bash script, the pipe is now honored, allowing the output of phantomjs to be seamlessly fed into ffmpeg.
The above is the detailed content of How to Properly Pipe Commands in Go's `os/exec` Package?. For more information, please follow other related articles on the PHP Chinese website!