我是一个实用程序的作者,它使使用zip压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序存储的项目(比如Chrome)。
我试图做一些改进,但遇到了一个问题,如下所述。
快速概述
我的实用程序的命令格式类似于command OPTIONS DEST DIR1 {DIR2 DIR3 DIR4...}。它通过运行zip -r DEST.zip DIR1来工作;这是一个相当简单的过程。然而,我的实用程序的好处是能够使用预先确定的文件(比如.gitignore)忽略特定的文件/目录,或者与模式匹配的文件/目录。
这很简单--如果目标目录(DIR1、DIR2、DIR3等)中存在"ignorefile“,那么我的实用工具将使用模式-x some_file或-x some_dir/*向zip -r DEST.zip DIR1命令添加排除项。
The Issue
然而,我遇到了目录排除的问题,但我不太明白为什么(这可能是因为我仍然是个新手)。我将介绍一些例子:
假设我想忽略项目目录中的两件事:.git/*和.gitignore。运行command foo.zip project_dir将生成以下命令:
zip -r foo.zip project -x project/.git/\* -x project/.gitignore
哇哦!成功!好吧..。不完全是。
在本例中,.gitignore没有添加到压缩输出文件foo.zip中。目录.git/*及其所有子目录(和文件)都是添加到压缩输出文件中的。
手动运行命令:
zip -r foo.zip project_dir -x project/.git/\* -x project/.gitignore
当然,正如预期的那样,我很自然地感到困惑,为什么我的相同但动态构建的命令不能工作。
尝试决议
我尝试了几种解决这一问题的不同方法,但都没有结果:
-x project/.git/\*,然后在该目录中添加每个子目录和文件,如-x project/.git/config -x project/.git/HEAD等(包括子目录的子目录)-x project/.git/*。几个注意事项
/bin/sh;为了实现最大的兼容性,我更愿意保持这种方式。git archive特性--我在上面的示例中使用.git/*和.gitignore只是作为一个例子;我的实用程序不依赖于git,也不专门用于git存储库的项目。发布于 2015-11-23 20:07:38
我怀疑问题会出现在生成的命令的评估中,因为您说过,在直接执行时,相同的命令是正确的。
因此,正如评论部分所说,我认为你已经找到了正确的解决方案。之所以会发生这种情况,是因为如果直接运行该变量,可以直接展开全局( globs )之类的东西,而不是传递给命令。争论可能会搞砸,这取决于具体情况。
是的,在这种情况下:
eval $COMMAND是该走的路。
https://stackoverflow.com/questions/33879205
复制相似问题