Почему эта команда curl не работает? - PullRequest
3 голосов
/ 17 ноября 2011

Привет, я просто хочу создать простое приложение golang, которое публикует новую вмятину на identi.ca, используя

curl -u username:password http://example.com/api/statuses/update.xml -d status='Howdy!' -d lat='30.468' -d long='-94.743'

Это мой код, и imho это должно работать, но на самом деле это не такне работает, кто-нибудь знает, как это исправить?

РЕДАКТИРОВАТЬ: Нет: я не получаю никаких сообщений об ошибках: /

package main

import(
        "fmt"
        "os"
        "bufio"
        "exec"
)
func main() {

var err os.Error
var username string

print("Username: ")
_, err = fmt.Scanln(&username)
if err != nil {
    fmt.Println("Error: ", err)
}

var password string
print("Password: ")
_, err = fmt.Scanln(&password)
if err != nil {
    fmt.Println("Error: ", err)
}

var status string
print("Status: ")
in := bufio.NewReader(os.Stdin);
status, err = in.ReadString('\n');
if err != nil {
    fmt.Println("Error: ", err)
}

exec.Command("curl -u " + username + ":" + password + "https://identi.ca/api/statuses/update.xml -d status='" + status +  "'" + "-d source='API'").Run()

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

exec.Command() не принимает всю командную строку в качестве одного аргумента. Вы должны назвать это как:

exec.Command("curl", "-u", username+":"+password, ...url..., "-d", "status="+status, "-d", "source=API").Run()

Как вы узнаете, что получили ошибку? Вы не проверяете возвращаемое значение Run().

Вы должны отделить создание команды от ее запуска. Таким образом, вы можете установить для процесса stdout и stderr что-то кроме /dev/null, например

c := exec.Command("curl", "-u", username+":"+password, "https://identi.ca/api/statuses/update.xml", "-d", "status="+status, "-d", "source=API")
c.Stdout = os.Stdout
c.Stderr = os.Stderr
err = c.Run()
if err != nil {
    fmt.Println("Error: ", err)
}
1 голос
/ 05 апреля 2013

Как объяснено здесь , exec.Command не разделяет аргументы командной строки, как это делает ваша обычная оболочка (bash, cmd и т. Д.).

Таким образом, помимо заполнения параметров как

exec.Command("your_executable", "-switch1", "value1", "-switch2", "value2")

, вы можете использовать bash или cmd (Windows), которые помогут вам

exec.Command("cmd","/C", "your_executable -switch1 value1 -switch2 value2")

или разделить аргументСтрока себя ( ref )

arguments := "-switch1 value1 -switch2 value2"

arg_slice := strings.Split(arguments, " ")

exec.Command("your_executable", arg_slice...)

Это наиболее удобно, так как вы можете создать строку arguments во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...