ホームページ >バックエンド開発 >Golang >Go の `os/exec` パッケージでコマンドを適切にパイプする方法は?

Go の `os/exec` パッケージでコマンドを適切にパイプする方法は?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-19 15:52:03714ブラウズ

How to Properly Pipe Commands in Go's `os/exec` Package?

Exec パッケージを使用した Go でのコマンドのパイプ

Go でのコマンドのパイプは、os/exec パッケージを使用して実現できます。ただし、あるコマンドの出力を別のコマンドにパイプしようとすると、問題が発生する可能性があります。この記事では、このような課題に対処し、解決策を提供します。

キャプチャされた画像からビデオを作成するために、phantomjs から ffmpeg に stdout をパイプする次のコマンドを考えてみましょう。

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

問題:

exec.Command(parts[0], Parts[1:]...) を使用してこのコマンドを実行すると、parts はコマンド コンポーネントを表し、パイプは無視されます。

解決策:

出力を効果的にパイプするには、次のアプローチを採用します。

exec.Command("bash", "-c", command) を使用して実行します。コマンドは bash スクリプトとして記述されます。ここで、command は目的のパイプされたコマンドです。このメソッドはパイプを透過的に処理します。

例:

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

コマンドを bash スクリプトとして実行すると、パイプが尊重されるようになり、phantomjs の出力を ffmpeg にシームレスに供給できるようになります。

以上がGo の `os/exec` パッケージでコマンドを適切にパイプする方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。