Maison >développement back-end >Golang >Comment diffuser la sortie en direct des commandes exécutées dans Go ?

Comment diffuser la sortie en direct des commandes exécutées dans Go ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-11-24 05:48:09829parcourir

How to Stream Live Output from Executed Commands in Go?

Sortie en direct des commandes exécutées

Cet extrait de code présente un problème souvent rencontré lors de l'exécution de commandes et de la récupération de leur sortie dans Go : la sortie devient disponible uniquement une fois l’exécution de la commande terminée. Pour résoudre ce problème, une solution modifiée est fournie qui permet la diffusion en direct de la sortie de la commande.

cmdParams := [][]string{
    {filepath.Join(dir, path), "npm", "install"},
    {filepath.Join(pdir, n.path), "gulp"},
}

for _, cp := range cmdParams {
    log.Printf("Starting %s in folder %s...", cp[1:], cp[0])
    cmd := exec.Command(cp[1], cp[2:]...)
    cmd.Dir = cp[0]

    stdout, err := cmd.StdoutPipe()
    if err != nil {
        log.Printf("%s cmd.StdoutPipe() error: %v\n", cp[1:], err)
        return
    }
    // Start command:
    if err = cmd.Start(); err != nil {
        log.Printf("%s start error: %v\n", cp[1:], err)
        return
    }

    // Stream command output:
    scanner := bufio.NewScanner(stdout)
    scanner.Split(bufio.ScanRunes)
    for scanner.Scan() {
        fmt.Print(scanner.Text())
    }
    if scanner.Err() != nil {
        log.Printf("Reading %s stdout error: %v\n", cp[1:], err)
        return
    }

    // Get execution success or failure:
    if err = cmd.Wait(); err != nil {
        log.Printf("Error running %s: %v\n", cp[1:], err)
        return
    }
    log.Printf("Finished %s", cp[1:])
}

Explication :

  • cmd.StdoutPipe() crée un tube qui nous permet de lire la sortie standard de la commande dans en temps réel.
  • bufio.NewScanner(stdout) crée un scanner qui lit à partir du canal de sortie par runes (caractères).
  • scanner.Scan() lit et imprime chaque caractère au fur et à mesure qu'il devient disponible.
  • La boucle continue de lire et d'imprimer les caractères jusqu'à ce que la commande se termine ou qu'une erreur se produise.
  • Après la commande se termine, la sortie restante est imprimée et l'état de sortie de la commande est récupéré.

Notes supplémentaires :

  • Cette solution diffuse uniquement la sortie standard. L'erreur standard peut également être diffusée à l'aide de Command.StderrPipe().
  • Certaines commandes peuvent ne pas tout écrire sur leur sortie standard ou générer une erreur. Dans de tels cas, la sortie peut ne pas être diffusée correctement.

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