Heim > Backend-Entwicklung > Golang > Wie führe ich Piped-Befehle in Go mit exec.Command() aus?

Wie führe ich Piped-Befehle in Go mit exec.Command() aus?

DDD
Freigeben: 2025-01-03 16:41:39
Original
764 Leute haben es durchsucht

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

Ausführen von Befehlen mit Pipes in Go mithilfe von exec.Command()

Beim Arbeiten mit der Funktion exec.Command() in Go können Benutzer Beim Versuch, Befehle auszuführen, die Pipes beinhalten, kann es zu Schwierigkeiten kommen. Während die Ausführung einfacher Befehle unkompliziert ist, kann die Verwendung von Pipes innerhalb dieser Befehle eine Herausforderung darstellen.

Problem:

In diesem Fall haben Benutzer beobachtet, dass der folgende Befehl erfolgreich ausgeführt wurde und gibt die Ausgabe des Befehls „ps“ aus:

out, err := exec.Command("ps", "cax").Output()
Nach dem Login kopieren

Der Versuch, eine Pipe innerhalb des Befehls zu verwenden, wie unten gezeigt, führt zu einem Fehler:

out, err := exec.Command("ps", "cax | grep myapp").Output()
Nach dem Login kopieren

Lösung:

Um dieses Problem anzugehen, sind zwei Ansätze zu berücksichtigen:

  1. Bestanden Alles zum Bash:

Eine Möglichkeit besteht darin, die gesamte Befehlszeile an Bash zu übergeben und es zu haben Führen Sie die Pipeline für Sie aus. Dieser Ansatz kann durch die Verwendung des folgenden Codes erreicht werden:

out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
Nach dem Login kopieren
  1. Idiomatischerer Ansatz:

Eine idiomatischere Art, mit dieser Situation umzugehen besteht darin, die Funktion exec.Command() zu verwenden, um zwei separate Befehle zu erstellen und dann deren Eingabe- und Ausgabestreams zu verbinden. Dies kann wie folgt erreicht werden:

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))
}
Nach dem Login kopieren

In diesem Beispiel wird der Befehl „ps“ zuerst ausgeführt und seine Ausgabe wird an den Befehl „grep“ weitergeleitet, der die Ausgabe basierend auf „redis“ filtert " Zeichenfolge. Das Ergebnis wird dann auf der Standardausgabe ausgegeben.

Das obige ist der detaillierte Inhalt vonWie führe ich Piped-Befehle in Go mit exec.Command() aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Erklärung dieser Website
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
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage