ホームページ >バックエンド開発 >Golang >Go の「exec.Command()」でコマンドのパイプ処理が失敗するのはなぜですか?どうすれば修正できますか?

Go の「exec.Command()」でコマンドのパイプ処理が失敗するのはなぜですか?どうすれば修正できますか?

Susan Sarandon
Susan Sarandonオリジナル
2024-12-16 11:03:14179ブラウズ

Why Does Piping Commands in Go's `exec.Command()` Fail, and How Can I Fix It?

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

Q: コマンドのパイプ処理が終了ステータス 1 で失敗する

exec.Command() を使用してコマンドをパイプしようとすると、次のエラーが発生します発生します:

ps, "cax | grep myapp"

ps cax が動作するのにこのコマンドが失敗するのはなぜですか?

A: exec.Command() による慣用的なパイプ処理

Passing bash のコマンド全体で問題を解決できますが、より慣用的な方法があります。解決策:

  1. ステップごとに個別のコマンド (ps と grep) を作成します。
  2. パイプを使用して標準入力と出力を接続します。
  3. 最初に ps を実行し、次に grep を実行します。 .

コード例:

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

    // Run ps first.
    ps.Start()

    // Run and get the output of grep.
    res, _ := grep.Output()

    fmt.Println(string(res))
}

説明:

  • grep と ps は別のコマンドとして作成されます。
  • パイプが作成されますps の stdout から grep の stdin へ。
  • ps が開始されます。まず、その出力が grep で使用できることを確認します。
  • 次に grep が実行され、その出力が取得され、目的の結果が得られます。

以上がGo の「exec.Command()」でコマンドのパイプ処理が失敗するのはなぜですか?どうすれば修正できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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