首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >gnu :菜谱中的shell函数执行顺序

gnu :菜谱中的shell函数执行顺序
EN

Stack Overflow用户
提问于 2019-10-16 09:10:03
回答 1查看 1.1K关注 0票数 4

我用的是$(shell .)gnu函数在Makefile配方中,它首先运行在前面的行之前。为什么?

一个非常简单的例子:

代码语言:javascript
复制
.PHONY: all
all:
    @echo 1
    @echo $(eval a=$(shell echo 2a 1>&2))2b
    @echo 3 $(a)

产出如下:

代码语言:javascript
复制
2a
1
2b
3

首先运行$(shell .)行(2a),然后是其他行。我怎样才能运行$(shell .)当它的行在菜谱中运行时,按以下顺序运行?

代码语言:javascript
复制
1
2a
2b
3

编辑:

没有$(空壳.)它如我所预期的那样工作:

代码语言:javascript
复制
.PHONY: all
all:
    @echo 1
    $(eval a=a)
    @echo 2 $(a)
    $(eval a=b)
    @echo 3 $(a)

输出:

代码语言:javascript
复制
1
2 a
3 b

编辑2:

这里是原始Makefile的一部分。>>>的部分展示了我问题的本质:我希望将udisksctl的输出放入一个make变量中,而不是$@.loop文件(并对$@.mount做同样的操作)。

代码语言:javascript
复制
$(HDIMG): $(BOOTBLOCK_MBR_BIN) $(BOOTBLOCK_EXT2_BIN) $(LOADER_BIN) | $(DESTDIR)
        dd if=/dev/zero of=$@.ext2 bs=1 seek=$(PSIZEB) count=0 2>/dev/null
        $(MKFSEXT2) -F $@.ext2 >/dev/null
        dd if=$(word 2,$^) of=$@.ext2 conv=notrunc 2>/dev/null
        cp $< $@
        dd if=/dev/zero of=$@ bs=1 seek=$(HDSIZEB) count=0 2>/dev/null
        echo $(PFDISK) | $(TR) | $(FDISK) $@ >/dev/null
        dd if=$@.ext2 of=$@ bs=512 seek=$(PSTART) conv=sparse,notrunc iflag=fullblock 2>/dev/null
>>>     udisksctl loop-setup --file $@ --offset $(PSTARTB) --size $(PSIZEB) >$@.loop
        sed -i -e 's/.* //;s/\.//' $@.loop
        cat $@.loop
>>>     udisksctl mount --block-device $$(cat $@.loop) >$@.mount
        sed -i -e 's/.* //;s/\.//' $@.mount
        cat $@.mount
        #
        mkdir -p $$(cat $@.mount)/boot/
        cp $(word 2,$^) $$(cat $@.mount)/boot/
        #/sbin/filefrag -b512 -e /
        #
        udisksctl unmount --block-device $$(cat $@.loop)
        udisksctl loop-delete --block-device $$(cat $@.loop)
        rm $@.loop
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 09:57:57

make运行一个菜谱时,它首先扩展其中的所有变量/函数,然后逐行运行shell命令。

您可以通过使用$(shell ...)执行每个shell命令,或者在您的示例中使用$(info ...)而不是echo来解决这个问题。

代码语言:javascript
复制
.PHONY: all
all:
    $(info 1)
    $(info $(eval a=$(shell echo 2a 1>&2))2b)
    $(info 3 $(a))

输出:

代码语言:javascript
复制
1
2a
2b
3
make: Nothing to be done for 'all'.

Nothing to be done for 'all'.部分是由这样一个事实引起的:在扩展函数之后,菜谱实际上是空的(有0 shell命令)。向其添加一个no-op命令(例如@true)将删除消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58409731

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档