-1

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

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

但我看到以下错误:

补丁:****找不到文件'<':没有这样的文件或目录

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

4

1 回答 1

3

您在文档中缺少这一段:

与来自 C 和其他语言的“系统”库调用不同,os/exec 包有意不调用系统 shell,也不扩展任何 glob 模式或处理通常由 shell 完成的其他扩展、管道或重定向。该包的行为更像 C 的“exec”函数系列。要扩展 glob 模式,可以直接调用 shell,注意转义任何危险的输入,或者使用 path/filepath 包的 Glob 函数。要扩展环境变量,请使用包 os 的 ExpandEnv。

shell 负责处理<操作。您可以将stdin文件设置为输入,也可以使用 shell。要使用外壳,请尝试以下操作:

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

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

于 2017-12-02T18:10:29.510 回答