2

I'm using Go with command to execute curl which works as expected

curl := exec.Command("curl", "https://services.odata.org/V3/northwind/northwind.svc/")
    out, err := curl.Output()
    if err != nil {
        fmt.Println("erorr" , err)
        return
    }
    fmt.Println(out)

Now I want to use some placeholders like

curl -O http://quiet-waters-1228.herokuapp.com/assets/image.jpg

but now I need to get the url for command e.g. if I run in bash mytool url I got the url value

`curl -O $(mytool url)`

The problem is that we need to execute the command in the code and I'm not sure how to pass it

curl := exec.Command("curl", "curl -O $(url)")
        out, err := curl.Output()
        if err != nil {
            fmt.Println("erorr" , err)
            return
        }
        fmt.Println(out)
4
  • 5
    Why? Why invoke curl? Why not make a simple HTTP request. It seems you are adding layer over layer. Stop doing that. XY problem here? Commented Nov 1, 2018 at 12:11
  • Second that - I cannot think of any scenario where one would want to invoke curl from a Go app rather than just using the native HTTP client. Commented Nov 1, 2018 at 13:09
  • I am considering this scenario after I had to use --ntlm with curl, which seems to be impossible with go Commented Aug 7, 2019 at 18:19
  • @Adrian what about digest authentication? Commented Oct 23 at 6:46

1 Answer 1

5

In os package you have slice of strings which contains all arguments passed by shell to your program.

os.Args 0th value, i.e., first element is going to be name of the command itself.

If your tool command is mytool, os.Args[0] contains mytool.

Rest are going to be the arguments, which are passed by shell.

package main

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

func main() {

    if len(os.Args) < 2 {
        // If argument is not provided quit
        log.Fatalln("url not provided")
    }
    url := os.Args[1] // URL

    cmd := exec.Command("curl", "-O", url)
    cmd.Run()
}

You can also download multiple URLs concurrently,

var wg *sync.WaitGroup

func main() {
    urls := os.Args[1:]

    wg = new(sync.WaitGroup)
    wg.Add(len(urls))

    for _, url := range urls {
        go download(url)
    }

    wg.Wait()
}

func download(url string) {
    defer wg.Done()
    cmd := exec.Command("curl", "-O", url)
    cmd.Run()
}
Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.