используя curl с командами в go - PullRequest
0 голосов
/ 01 ноября 2018

Я использую Go с командой для выполнения curl, которая работает как ожидалось

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)

Теперь я хочу использовать некоторые заполнители, такие как

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

но теперь мне нужно получить URL для команды например если я запускаю в Bash mytool url я получил значение URL

`curl -O $(mytool url)`

Проблема в том, что нам нужно выполнить команду в коде, и я не уверен, как ее передать

curl := exec.Command("curl", "curl -O $(url)")
        out, err := curl.Output()
        if err != nil {
            fmt.Println("erorr" , err)
            return
        }
        fmt.Println(out)

1 Ответ

0 голосов
/ 01 ноября 2018

В пакете os у вас есть фрагмент строки, который содержит все аргументы, передаваемые оболочкой вашей программе.

os.Args 0-е значение, т. Е. Первый элемент будет именем самой команды.

Если ваша команда инструмента mytool, os.Args[0] содержит mytool.

Остальные будут аргументами, которые передаются оболочкой.

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()
}

Вы также можете загружать несколько URL одновременно,

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()
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...