Heim >Backend-Entwicklung >Golang >Warum schlagen Piping-Befehle in „exec.Command()' von Go fehl und wie kann ich das beheben?

Warum schlagen Piping-Befehle in „exec.Command()' von Go fehl und wie kann ich das beheben?

Susan Sarandon
Susan SarandonOriginal
2024-12-16 11:03:14122Durchsuche

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

Ausführen von Piped-Befehlen in Go mit exec.Command()

F: Piping-Befehle schlagen mit Exit-Status 1 fehl

Beim Versuch, Befehle mit exec.Command() weiterzuleiten, wird der folgende Fehler angezeigt tritt auf:

ps, "cax | grep myapp"

Warum schlägt dieser Befehl fehl, während ps cax funktioniert?

A: Idiomatisches Piping mit exec.Command()

Bestanden Der gesamte Befehl zum Bash kann das Problem lösen, aber es gibt noch eine idiomatischere Möglichkeit Lösung:

  1. Erstellen Sie separate Befehle für jeden Schritt (ps und grep).
  2. Verbinden Sie ihre Standardeingabe und -ausgabe mithilfe von Pipes.
  3. Führen Sie zuerst ps und dann grep aus .

Code Beispiel:

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))
}

Erklärung:

  • grep und ps werden als separate Befehle erstellt.
  • Eine Pipe wird erstellt von ps's stdout zu grep's stdin.
  • ps wird zuerst gestartet, um sicherzustellen, dass seine Ausgabe verfügbar ist für grep.
  • grep wird dann ausgeführt und seine Ausgabe wird abgerufen, was das gewünschte Ergebnis liefert.

Das obige ist der detaillierte Inhalt vonWarum schlagen Piping-Befehle in „exec.Command()' von Go fehl und wie kann ich das beheben?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn