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

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

Susan Sarandon
リリース: 2024-12-16 11:03:14
オリジナル
120 人が閲覧しました

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

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