Skip to content

Instantly share code, notes, and snippets.

Embed
What would you like to do?
get the realtime output for a shell command in golang|-|{"files":{"shell_output.go":{"env":"plain"}},"tag":"bigdata"}
package main
import (
"bufio"
"fmt"
"io"
"os"
"os/exec"
"strings"
)
func main() {
cmdName := "ping 127.0.0.1"
cmdArgs := strings.Fields(cmdName)
cmd := exec.Command(cmdArgs[0], cmdArgs[1:len(cmdArgs)]...)
stdout, _ := cmd.StdoutPipe()
cmd.Start()
oneByte := make([]byte, 100)
num := 1
for {
_, err := stdout.Read(oneByte)
if err != nil {
fmt.Printf(err.Error())
break
}
r := bufio.NewReader(stdout)
line, _, _ := r.ReadLine()
fmt.Println(string(line))
num = num + 1
if num > 3 {
os.Exit(0)
}
}
cmd.Wait()
}
@bluevariant

This comment has been minimized.

Copy link

@bluevariant bluevariant commented Mar 3, 2018

nice work 👍 thanks

@swallowstalker

This comment has been minimized.

Copy link

@swallowstalker swallowstalker commented Jun 28, 2018

nice, it really helps 👍

@shri3k

This comment has been minimized.

Copy link

@shri3k shri3k commented Dec 2, 2019

For people coming from google - I revised a bit.

package main

import (
  "bufio"
  "os"
  "os/exec"
  "fmt"
  "log"
)

func main() {
  cmd := exec.Command("ping", "127.0.0.1")
  stdout, err := cmd.StdoutPipe()
  if err != nil {
    log.Fatal(err)
  }
  cmd.Start()

  buf := bufio.NewReader(stdout) // Notice that this is not in a loop
  num := 1
  for {
    line, _, _ := buf.ReadLine()
    if num > 3 {
      os.Exit(0)
    }
    num += 1
    fmt.Println(string(line))
  }
}
@krisztianodor

This comment has been minimized.

Copy link

@krisztianodor krisztianodor commented Dec 15, 2020

You guys are the best!!! )

@hostbet

This comment has been minimized.

Copy link

@hostbet hostbet commented May 1, 2021

Hello Sir, i want to run some curl bash scripts via golang want to show that script’s realtime output to the user.
for example,
i want to run
curl -Lso- bench.sh | bash
in golang and show realtime output to the user, how can i do this?

actually, i want to run some bash scripts and some binary files via golang and show the output to the user (realtime output) if read line by line and show to user then also OK but output should show to user in fast time
not like bash script executed and after execution output will show, i don’t want like that.
the bash script installs library and packages so it may take some time so that i want to show real time output of the bash script to user.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment