我想向 Makefile 添加一系列命令来附加配置行当他们尚未出现时。我过去曾以如下方式完成此操作:
grep -vq "keyword" /a/b/c.conf && echo "abc keyword" >> /a/b/c.conf
但是,我显然忽略了一些事情。命令按原样导致重新运行时配置行重复。
手动测试显示该模式按预期工作:
grep -vq "keyword" /a/b/c.conf && echo "the line is absent"
... 印刷该行不存在 仅有的当线路实际上不存在时。并且,echo
命令是正确的不是当该行被执行时展示。
我缺少什么?
笔记:为了便于阅读,上面的示例进行了精简。事实上,类似的命令还会有很多。这是我尝试过的特定命令:
grep -vq "md_module" /etc/httpd/conf.modules.d/00-ssl.conf && echo "LoadModule md_module module/mod_md.so" >> /etc/httpd/conf.modules.d/00-ssl.会议
答案1
问题是grep -v
会匹配线与表达式不匹配的文件,而不是与表达式不匹配的文件...
所以如果你的文件有任何不匹配的行将grep -v
匹配这些行,因此 grep 将返回成功。
更好的方法是使用积极的匹配关键字,然后根据需要使用||
(而不是&&
) 附加该行:
grep -q "keyword" /a/b/c.conf || echo "abc keyword" >> /a/b/c.conf
你的测试可能会echo "the line is absent"
说它不存在,但实际上它不存在......如果是这样的话,也许什么也不做仅有的线。如果您进一步测试这一点,我想您会发现只要它确实有任何与关键字不匹配的行,您就会得到匹配项。
我希望这能澄清这一点!