为什么这个curl命令不起作用?

时间:2011-11-17 16:17:21

标签: go

您好,我只想创建一个简单的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 个答案:

答案 0 :(得分:4)

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 :(得分:1)

正如here所解释的那样,exec.Command不会像正常的shell环境那样拆分命令行参数(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字符串。