Maison > développement back-end > Golang > le corps du texte

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

Mary-Kate Olsen
Libérer: 2024-11-24 05:48:09
original
725 Les gens l'ont consulté

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

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!

source:php.cn
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal