使用“!”的技巧 cp
在 shell 下使用作品时排除目录,但在以下情况下不起作用make
:
mkdir db09601c && cp -r !(db09601c) db09601c
/usr/bin/bash: -c: line 0: syntax error near unexpected token ('
/usr/bin/bash: -c: line 0:mkdir db09601c && cp -r !(db09601c) db09601c'
我已经把SHELL=/bin/bash
Makefile 放在上面了:
PROJECT_NAME=nnr
HASH=$(shell git log -n1 --pretty=format:%h)
REVS=$(shell git log --oneline|wc -l)
SHELL=/bin/bash
build:
mkdir $(HASH) && cp -r !($(HASH)) $(HASH)
cp INSTALL.tpl INSTALL
sed -i 's/{_G_HASH}/$(HASH)/' INSTALL
chmod x INSTALL
echo $(REVS).$(HASH) > $(HASH)/VERSION
tar czf $(PROJECT_NAME)-$(REVS).$(HASH).tar.gz $(HASH) INSTALL
rm -rf INSTALL $(HASH)
uj5u.com热心网友回复:
扩展的 glob 语法特定于 Bash。如果您愿意SHELL=/bin/bash
在 Makefile 中进行硬编码(最初发布问题时没有提到这一点),您仍然可以使用此语法(尽管您可能应该单独验证是否使用 启用了扩展通配符语法shopt -s extglob
)。
对于便携式解决方案,可能只需回圈遍历物件:
$(HASH):
mkdir -p $(HASH)
for f in *; do \
case $$f in $(HASH)) continue;; esac; \
cp -r "$$f" $(HASH); \
done
(为了健壮性,您可能应该创建一个临时目录,并且只有在正确填充时才将其移动到最终目的地,但这留作练习。)
0 评论