exec.Command() を使用してコマンドを実行すると、パイプを含むコマンドを実行できるため、次のことが可能になります。複数のコマンドを連鎖させます。
たとえば、次のコマンドは ps cax を実行し、成功します:
out, err := exec.Command("ps", "cax").Output()
ただし、次のコマンドを使用して ps cax の出力を grep myapp にパイプしようとすると失敗します:
out, err := exec.Command("ps", "cax | grep myapp").Output()
この問題を解決するには、より慣用的な方法を採用できます。 Go でパイプを使用したアプローチ:
package main import ( "fmt" "os/exec" ) func main() { grep := exec.Command("grep", "redis") ps := exec.Command("ps", "cax") // Connect ps's stdout to grep's stdin. pipe, _ := ps.StdoutPipe() defer pipe.Close() grep.Stdin = pipe // Start ps first. ps.Start() // Run and retrieve the output of grep. res, _ := grep.Output() fmt.Println(string(res)) }
この例では、2 つの exec.Cmd を作成します。コマンドごとに 1 つずつ構造体を作成し、ps の stdout と grep の stdin の間にパイプを確立します。最初に ps を開始することで、その出力を grep が使用できるようにします。次に、grep を実行してその出力を取得し、2 つのコマンドを効果的に連鎖させます。
以上がGo の「exec.Command()」を使用してパイプされたコマンドを効果的に実行する方法?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。