【问题标题】:exec.Command with cp exits with status 1带有 cp 的 exec.Command 以状态 1 退出
【发布时间】:2017-01-16 21:38:23
【问题描述】:
util.ExecuteCommandWithOuput(exec.Command("cp", "-r", "./*.json", artifact.dir))

func ExecuteCommandWithOuput(cmd *exec.Cmd) {
    output, err := cmd.Output()
    if err != nil {
        log.Print("Error executing ", cmd.Args, err)
    }
    fmt.Print(string(output))
}

输出

2017/01/16 13:26:35 Error executing [cp -r ./*.json myartifact] exit status 1

问题

  1. 如何获取关于 cp 失败的完整错误消息的详细信息 命令 ?我确实有 err != nill 和 Print err
  2. exec.Command 不支持文件复制和目录递归复制吗?
  3. 任何建议我如何实现文件的副本和递归副本 目录?

我刚刚开始采用 Go,因此是 Go 的新人。

【问题讨论】:

  • 问和回答了here

标签: go exec


【解决方案1】:

您不能在exec.Command 中使用通配符。我会遍历目录中的文件并检查扩展名是否以.json 结尾,然后复制该文件。

【讨论】:

    【解决方案2】:

    问题

    解释一下:所谓的“通配符”是由您通常在其中执行命令行命令的 shell 扩展的。也就是说,当您调用 cp -r ./*.json dir/ 时,shell 会启动,自行扩展 *.json — 生成与该模式匹配并位于当前目录中的文件的名称列表,并传递 cp 命令 a此类名称的列表

    因此,如果您有 10 个匹配的文件,则对 cp 的实际调用最终会看起来像

    cp -r file1.json file2.json ... dir/
    

    当您直接调用 cp ... 时——没有 shell 启动并为您扩展 *.json“fileglob”,cp 命令会逐字接收文件名称“*.json”并尝试打开它。由于应该不存在确切命名为“*.json”的文件,cp 失败并退出。

    解决方案

    第一个(当然是蹩脚的)解决方案是将调用传递给cp“通过”一个shell。也就是说,将对cp 的调用转换为shell 脚本并将其传递给shell。

    最简单的方法是使用类似

    exec.Command(`/bin/sh -c 'cp -r ./*.json manifest'`)
    

    这将调用一个shell /bin/sh 并通过它的-c 命令行选项将脚本传递给它执行。

    另一种解决方案是使用标准 Go 库滚动复制自己:path/filepath 包的功能既支持扩展 fileglob,就像 shell 所做的那样,也支持迭代给定目录的条目。使用这些方法中的任何一种,您都可以构建要复制和/或迭代它们的文件列表。

    然后你可以使用函数os.OpenFile()打开源文件和目标文件,io.Copy()复制它们之间的内容。

    【讨论】:

      【解决方案3】:

      【讨论】:

        猜你喜欢
        • 2018-04-02
        • 2021-08-21
        • 2013-08-12
        • 2018-10-16
        • 1970-01-01
        • 2010-12-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多