duanjiao2978 2015-08-01 13:14
浏览 295
已采纳

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

I am trying to clone a git repository by calling git via syscall. (I know there is git2go but that's not what I want. I definitely want to do a syscall)

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

if lookErr != nil {
    fmt.Fprintf(os.Stderr, "%s
", 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)
}

So what I want to execute is git clone http://github.com/some/repo.git and executing this manually works just fine. But when I run it in go like in the code snippet above, git fails with this:

git: 'http://github.com/some/repo.git' is not a git command. See 'git --help'.

Why would git interpret the 2nd argument as another command? It is supposed to be the remote <repo> URL, git clone [options] [--] <repo> [<dir>].

How do I pass the arguments correctly so git has the expected behavior?

  • 写回答

1条回答 默认 最新

  • dqve65954 2015-08-01 17:31
    关注

    The first argument of argv is usually a program's name, so just add it there:

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

    See also: os.Args variable.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥50 求解vmware的网络模式问题 别拿AI回答
  • ¥24 EFS加密后,在同一台电脑解密出错,证书界面找不到对应指纹的证书,未备份证书,求在原电脑解密的方法,可行即采纳
  • ¥15 springboot 3.0 实现Security 6.x版本集成
  • ¥15 PHP-8.1 镜像无法用dockerfile里的CMD命令启动 只能进入容器启动,如何解决?(操作系统-ubuntu)
  • ¥30 请帮我解决一下下面六个代码
  • ¥15 关于资源监视工具的e-care有知道的嘛
  • ¥35 MIMO天线稀疏阵列排布问题
  • ¥60 用visual studio编写程序,利用间接平差求解水准网
  • ¥15 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?