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

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

Patricia Arquette
リリース: 2024-11-19 15:52:03
オリジナル
703 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート