Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 动态创建';拉链';命令未正确排除目录_Regex_Linux_Shell_Sh - Fatal编程技术网

Regex 动态创建';拉链';命令未正确排除目录

Regex 动态创建';拉链';命令未正确排除目录,regex,linux,shell,sh,Regex,Linux,Shell,Sh,我是一个实用程序的作者,它使使用zip压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序商店(如Chrome的Web商店)的项目 我试图做一些改进,但遇到了一个问题,如下所述 快速概述 我的实用程序的命令格式类似于命令选项DEST DIR1{DIR2 DIR3 DIR4…}。它通过运行zip-r DEST.zip DIR1来工作;一个相当简单的过程。然而,我的实用程序的好处是能够使用预先确定的文件(想想.gitignore)忽略特定的文件/目录,或者与模式匹配的文件/目录 这很

我是一个实用程序的作者,它使使用
zip
压缩项目变得更容易,特别是当您必须定期压缩时,例如更新提交到应用程序商店(如Chrome的Web商店)的项目

我试图做一些改进,但遇到了一个问题,如下所述

快速概述
我的实用程序的命令格式类似于
命令选项DEST DIR1{DIR2 DIR3 DIR4…}
。它通过运行
zip-r DEST.zip DIR1来工作;一个相当简单的过程。然而,我的实用程序的好处是能够使用预先确定的文件(想想
.gitignore
)忽略特定的文件/目录,或者与模式匹配的文件/目录

这很简单——如果“ignorefile”存在于目标目录(DIR1、DIR2、DIR3等)中,我的实用程序将使用模式
-x some_file
-x some_dir/*
zip-r DEST.zip DIR1
添加排除项

问题
然而,我遇到了一个目录排除的问题,我不太明白为什么(这可能是因为我还是sh新手)。我将介绍一些示例:

假设我想忽略项目目录中的两件事:
.git/*
.gitignore
。运行
command foo.zip project\u dir
生成以下命令:

zip-r foo.zip project-x project/.git/\*-x project/.gitignore

呜呼!成功!好。。。不完全是

在本例中,
.gitignore
未添加到压缩输出文件
foo.zip
。目录
.git/*
及其所有子目录(和文件)将添加到压缩输出文件中


手动运行命令:

zip-r foo.zip project\u 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
    特性——我在上述示例中使用的
    .git/*
    .gitignore
    只是一个示例;我的工具不依赖于git,也不专门用于git存储库项目


我怀疑问题出在对生成的命令的评估上,因为您说直接执行同一个命令是正确的

因此,正如评论部分所说,我认为您已经找到了正确的解决方案。发生这种情况是因为如果直接运行该变量,可以直接展开globs之类的内容,而不是传递给命令。而争论可能会混乱,这取决于具体情况

是的,在这种情况下:

eval $COMMAND

就是要做的。

我怀疑问题可能出在对生成的命令的评估上,因为您说过直接执行同一命令是正确的

因此,正如评论部分所说,我认为您已经找到了正确的解决方案。发生这种情况是因为如果直接运行该变量,可以直接展开globs之类的内容,而不是传递给命令。而争论可能会混乱,这取决于具体情况

是的,在这种情况下:

eval $COMMAND

方法是这样的。

您如何运行生成的命令?这是关键部分,未显示。另外,我也很感谢你抽出时间来讲述整个故事,但下一次请直接讨论问题。问题需要简洁直接。@sidyll,该命令存储在变量命令中,然后使用
$command
执行(我也使用了
${command}
)。您为我指出了正确的方向,并使用
eval$命令
按预期工作。如果你想写一个答案,我可以把它标记为正确。谢谢你重新开始这个问题。这并不是因为观点,但留给未来可能遇到类似问题的观众可能会很有用。这是本网站背后的伟大意图,维护解决方案数据库。最美好的祝愿Benjamin这正是我留下有力描述的原因;)——尽管在大多数情况下,直截了当和简洁绝对是可取的!再次感谢,继续摇滚!如何运行生成的命令?这是关键部分,未显示。另外,我也很感谢你抽出时间来讲述整个故事,但下一次请直接讨论问题。问题需要简洁直接。@sidyll,该命令存储在变量命令中,然后使用
$command
执行(我也使用了
${command}
)。您为我指出了正确的方向,并使用
eval$命令
按预期工作。如果你想写一个答案,我可以把它标记为正确。谢谢你重新开始这个问题。这并不是因为观点,但留给未来可能遇到类似问题的观众可能会很有用。这是本网站背后的伟大意图,维护解决方案数据库。祝本杰明一切顺利