exec.Command() を使用して Go でパイプを使用してコマンドを実行する
Go で exec.Command() 関数を使用する場合、ユーザーはパイプを含むコマンドを実行しようとすると、問題が発生する可能性があります。単純なコマンドの実行は簡単ですが、これらのコマンド内でパイプを使用すると課題が生じる可能性があります。
問題:
この例では、次のコマンドが正常に実行されていることがユーザーによって観察されています。そして、「ps」コマンドの出力を出力します:
out, err := exec.Command("ps", "cax").Output()
以下に示すように、コマンド内でパイプを使用しようとしています。エラーが発生します:
out, err := exec.Command("ps", "cax | grep myapp").Output()
解決策:
この問題に対処するには、次の 2 つのアプローチを考慮する必要があります:
1 つのオプションは、コマンド ライン全体を bash に渡し、パイプラインを実行させることです。このアプローチは、次のコードを使用して実現できます。
out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
この状況を処理するより慣用的な方法exec.Command() 関数を使用して 2 つの別々のコマンドを作成し、それらの入力ストリームと出力ストリームを接続します。これは次のように実行できます。
package main import ( "fmt" "os/exec" ) func main() { grep := exec.Command("grep", "redis") ps := exec.Command("ps", "cax") // Get ps's stdout and attach it to grep's stdin. pipe, _ := ps.StdoutPipe() defer pipe.Close() grep.Stdin = pipe // Run ps first. ps.Start() // Run and get the output of grep. res, _ := grep.Output() fmt.Println(string(res)) }
この例では、最初に「ps」コマンドが実行され、その出力が「grep」コマンドにパイプされ、「redis」に基づいて出力がフィルタリングされます。 " 弦。結果は標準出力に出力されます。
以上がGo で exec.Command() を使用してパイプされたコマンドを実行する方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。