拨开荷叶行,寻梦已然成。仙女莲花里,翩翩白鹭情。
IMG-LOGO
主页 文章列表 cp除了档案在Makefile中不起作用

cp除了档案在Makefile中不起作用

白鹭 - 2022-01-24 2311 0 0

使用“!”的技巧 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/bashMakefile 放在上面了:

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 评论

发表评论

您的电子邮件地址不会被公开。 必填的字段已做标记 *