Executing Complex Piped Commands in Golang
In Golang, utilizing the os/exec package provides a convenient way to execute commands within your programs. However, certain scenarios may require you to run sophisticated commands involving pipes, where the output of one command serves as the input for another.
Consider the following example, where the goal is to record a webpage using phantomjs and pipe the resulting images to ffmpeg to create a video:
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
Traditionally, using the exec.Command method may not correctly interpret the pipe, making it ineffective. To overcome this limitation, utilize the following approach:
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 { return fmt.Sprintf("Failed to execute command: %s", cmd) } fmt.Println(string(output))
In this improved version, we use bash as an intermediate command runner. By invoking bash with the -c flag and passing the entire piped command string as an argument, we effectively instruct bash to execute the complex operation.
This approach allows you to execute intricate piped commands within Go programs, providing greater flexibility and control over system interactions.
The above is the detailed content of How to Execute Complex Piped Commands (e.g., phantomjs | ffmpeg) in Golang?. For more information, please follow other related articles on the PHP Chinese website!