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
Libérer: 2025-01-03 16:41:39
original
752 Les gens l'ont consulté

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()
Copier après la connexion

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()
Copier après la connexion

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()
Copier après la connexion
  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))
}
Copier après la connexion

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 de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal