Почему эта команда завитка не работает?

Привет, я просто хочу создать простые приложения 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 ответа

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


Как объяснено здесь, 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 во время выполнения.

licensed under cc by-sa 3.0 with attribution.