Maison >développement back-end >Golang >Comment exécuter des commandes redirigées dans Go à l'aide de exec.Command() ?

Comment exécuter des commandes redirigées dans Go à l'aide de exec.Command() ?

DDD
DDDoriginal
2025-01-03 16:41:39764parcourir

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

Exécuter des commandes avec des tuyaux dans Go à l'aide de exec.Command()

Lorsque vous travaillez avec la fonction exec.Command() dans Go, les utilisateurs peut rencontrer des difficultés lors de la tentative d'exécution de commandes impliquant des tubes. Bien que l'exécution de commandes simples soit simple, l'utilisation de canaux dans ces commandes peut poser des problèmes.

Problème :

Dans ce cas, les utilisateurs ont observé que même si la commande suivante s'exécute avec succès et imprime le résultat de la commande "ps":

out, err := exec.Command("ps", "cax").Output()

Tenter d'utiliser un tube dans la commande, comme vu ci-dessous, entraîne un erreur :

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

Solution :

Pour résoudre ce problème, il existe deux approches à considérer :

  1. Passer Tout à Bash :

Une option consiste à transmettre toute la ligne de commande à bash et demandez-lui d'exécuter le pipeline pour vous. Cette approche peut être obtenue en utilisant le code suivant :

out, err := exec.Command("bash", "-c", "ps cax | grep myapp").Output()
  1. Approche plus idiomatique :

Une manière plus idiomatique de gérer cette situation consiste à utiliser la fonction exec.Command() pour créer deux commandes distinctes, puis à connecter leurs flux d'entrée et de sortie. Cela peut être accompli comme suit :

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

Dans cet exemple, la commande "ps" est exécutée en premier et sa sortie est redirigée vers la commande "grep", qui filtre la sortie en fonction du "redis " chaîne. Le résultat est ensuite imprimé sur la sortie standard.

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