Maison >développement back-end >Golang >Pourquoi les commandes de tuyauterie dans « exec.Command() » de Go échouent-elles et comment puis-je y remédier ?

Pourquoi les commandes de tuyauterie dans « exec.Command() » de Go échouent-elles et comment puis-je y remédier ?

Susan Sarandon
Susan Sarandonoriginal
2024-12-16 11:03:14125parcourir

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

Exécution de commandes canalisées dans Go à l'aide de exec.Command()

Q : Les commandes canalisées échouent avec l'état de sortie 1

Lorsque vous tentez de transmettre des commandes à l'aide de exec.Command(), l'erreur suivante se produit :

ps, "cax | grep myapp"

Pourquoi cette commande échoue-t-elle alors que ps cax fonctionne ?

A : Piping idiomatique avec exec.Command()

Passer la commande entière à bash peut résoudre le problème, mais il existe une méthode plus idiomatique solution :

  1. Créez des commandes distinctes pour chaque étape (ps et grep).
  2. Connectez leur entrée et sortie standard à l'aide de tuyaux.
  3. Exécutez d'abord ps, puis grep .

Code Exemple :

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

Explication :

  • grep et ps sont créés en tant que commandes distinctes.
  • Un canal est créé de la sortie standard de ps au stdin de grep.
  • ps est démarré en premier, garantissant que sa sortie est disponible pour grep.
  • grep est ensuite exécuté et sa sortie est récupérée, fournissant le résultat souhaité.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn