如何正确地将参数传递给syscall(git)?

时间:2015-08-01 13:14:33

标签: go arguments system-calls

我试图通过syscall调用git来克隆git存储库。 (我知道有git2go但这不是我想要的。我绝对想做syscall

git, lookErr := exec.LookPath("git")

if lookErr != nil {
    fmt.Fprintf(os.Stderr, "%s\n", lookErr)
    os.Exit(126)
}

args := []string{"clone", "http://github.com/some/repo.git"}

var env = os.Environ()

execErr := syscall.Exec(git, args, env)

if execErr != nil {
  panic(execErr)
}

所以我想要执行的是git clone http://github.com/some/repo.git并且手动执行此功能就可以了。但是,当我在上面的代码片段中运行它时,git失败了:

  

git:'http://github.com/some/repo.git'不是git命令。见'git --help'。

为什么git会将第二个参数解释为另一个命令?它应该是远程<repo>网址git clone [options] [--] <repo> [<dir>]

如何正确传递参数,以便git具有预期的行为?

1 个答案:

答案 0 :(得分:2)

argv的第一个参数通常是程序的名称,所以只需将其添加到那里:

args := []string{git, "clone", "http://github.com/some/repo.git"}
var env = os.Environ()
if err := syscall.Exec(git, args, env); err != nil {
    panic(err)
}

另见:os.Args变量。