当我以为我不会遇到坑的时候,坑就在那里,不偏不移,刚好让我踩过去。之前写了关于如何调用系统命令的小结,这里果然不负我望,当场让我晓得了,总结不够到位,有瑕疵。

项目有用到cp的操作,大概就是把某目录下的所有文件复制到上级目录中,也就是cp -rf ./test/* ../

首先看代码。

1
2
3
cpCmd := exec.Command("cp", "-rf", "./test/*", "../")
cpCmd.Dir = "/home/tmp"
err := cpCmd.Run()

代码看起来是没有问题的,但是运行起来,却是会报出错误。

1
cp: cannot stat ‘./test/*’: No such file or directory

这是为何呢,若是直接在shell中运行该命令,是没有问题的,为什么在程序中运行就会出现问题呢?

用力Google了一下,查到cp: cannot stat ‘/some/path/*’: No such file or directory

大概的意思是,该*会被处理成字符串,而不是特殊意义上的通配符,所以,也就会被认定为一个文件或者文件夹,所以,它就报错了,大概就是这么个情况。

至于程序中如何解决这种情况呢?准确的来讲,我其实是没有找到解决方式的,也就只是换了种替代方式(一个一个文件/文件夹移动)。

123

这里,还发现另一个问题,若调用命令如:

1
cpCmd := exec.Command("sh", "-c","cp", "-rf", "./test/*", "../")

则程序将报出:

1
cp: missing file operand

同样的,很遗憾,我未能找到具体发生这个现象的原因,算起来,这算是比较坑爹的问题吧,因为是面对项目,只能说碰到了优先以解决为主,当时间不允许的情况下,赶紧避开。

这里记录一下,我再找找出现问题的原因。

这里放一个小的复制封装:https://github.com/juju/utils/blob/master/fs/copy.go