【问题标题】:How to pass arguments correctly to syscall (git)?如何正确地将参数传递给系统调用(git)?
【发布时间】:2015-10-24 01:57:42
【问题描述】:

我正在尝试通过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,手动执行它就可以了。但是当我像上面的代码 sn-p 那样在 go 中运行它时,git 失败了:

git: 'http://github.com/some/repo.git' 不是 git 命令。请参阅“git --help”。

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

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

【问题讨论】:

    标签: go arguments system-calls


    【解决方案1】:

    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 变量。

    【讨论】:

    • 我明白了。这有点不直观,因为程序名称已经作为第一个参数传递,并且第一个参数被明确使用,因为错误消息来自 git。但是看着我学习的example,我应该已经注意到了。我只是没想到会再次将程序名称作为参数传递,所以我没有注意示例中的值。我的错。感谢清理。
    猜你喜欢
    • 2011-08-11
    • 2017-08-25
    • 2016-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-29
    • 2014-04-02
    相关资源
    最近更新 更多