exec.Command with cp exits状态为1

时间:2017-01-16 21:38:24

标签: go exec

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失败的完整错误消息的详细信息 命令?我确实有错误!= nill和打印错误
  2. exec.Command不支持文件副本和目录的递归副本吗?
  3. 我是如何实现文件副本和递归副本的 目录?
  4. 我刚刚开始采用Go,因此是Go的新人。

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

问题

解释:所谓的“通配符”由shell执行命令行命令扩展。也就是说,当您调用cp -r ./*.json dir/时,shell会自动扩展*.json - 生成与该模式匹配且位于当前目录中的文件的名称列表并传递{{1}命令这些名称的列表

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

cp

当你直接传递调用cp -r file1.json file2.json ... dir/ 而没有shell开始并为你扩展cp ...“fileglob”时,*.json命令会收到文件名“* .json “逐字逐句地试图打开它。由于名为“* .json”的文件据称不存在,cp会失败并退出。

解决方案

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

最简单的方法是使用

之类的东西
cp

这将调用shell exec.Command(`/bin/sh -c 'cp -r ./*.json manifest'`) 并将脚本传递给它,以通过其/bin/sh命令行选项执行。

另一种解决方案是使用标准Go库自行滚动复制:-c包的功能支持扩展fileglobs,因为shell会执行此操作并迭代给定目录的条目。使用这些方法中的任何一种,您都可以构建要复制和/或迭代它们的文件列表。

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

答案 2 :(得分:0)