【问题标题】:exec.command for patch commandexec.command 用于补丁命令
【发布时间】:2018-05-16 14:11:00
【问题描述】:

我正在尝试使用以下命令修补文件

patch -p0 < <file_path>

我的 runCommand 语法如下:

func runCommand(cmd string, args ...string) error {
    ecmd := exec.Command(cmd, args...)
    ecmd.Stdout = os.Stdout
    ecmd.Stderr = os.Stderr
    ecmd.Stdin = os.Stdin
    err := ecmd.Run()
    return err
}

现在我传递我的补丁命令如下:

cmd = "patch"
args := []string{"-p0", "<",  "/tmp/file"}
err = runCommand(cmd, args...)

但我看到以下错误:

补丁:****找不到文件'

你能告诉我我在这里缺少什么吗?

【问题讨论】:

    标签: go patch goland


    【解决方案1】:

    您在documentation 中遗漏了这一段:

    与 C 和其他语言的“系统”库调用不同, os/exec 包故意不调用系统 shell 和 不扩展任何 glob 模式或处理其他扩展, 管道,或通常由 shell 完成的重定向。包裹 行为更像 C 的“exec”函数族。扩展全局 模式,或者直接调用 shell,注意逃避任何 危险的输入,或者使用 path/filepath 包的 Glob 函数。到 展开环境变量,使用包os的ExpandEnv。

    shell 负责处理&lt; 操作。您可以使用文件作为输入自己设置stdin,也可以使用shell。要使用 shell,请尝试以下操作:

    runCommand("/bin/sh", "patch -p0 < /tmp/file")
    

    请注意,这不适用于 Windows。自己读取文件并写入stdin 是一种更易于移植的解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-06-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-05-21
      • 2021-08-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多