您好,我只想创建一个简单的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()
答案 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
字符串。