ホームページ > バックエンド開発 > Golang > Go で exec.Command() を使用してパイプされたコマンドを実行する方法は?

Go で exec.Command() を使用してパイプされたコマンドを実行する方法は?

DDD
リリース: 2025-01-03 16:41:39
オリジナル
732 人が閲覧しました

How to Execute Piped Commands in Go using exec.Command()?

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:

1 つのオプションは、コマンド ライン全体を bash に渡し、パイプラインを実行させることです。このアプローチは、次のコードを使用して実現できます。

out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
ログイン後にコピー
  1. より慣用的なアプローチ:

この状況を処理するより慣用的な方法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 サイトの他の関連記事を参照してください。

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