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 :
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()
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!