Linux for 的表达是在shell 和makefile的区别

1,for 在shell
ALL_FILES="`find rootfs/ -type f`";
for x in ${ALL_FILES};
do
  if [ -n "`file ${x} | grep ELF`" ]; then chmod +w ${x}; strip ${x}; chmod -w ${x};
  fi;
done;

2,for 在makefile

ALL_FILES=$(shell find rootfs/ -type f)
for x in ${ALL_FILES}; \
do \
  if [ -n "`file $$x | grep ELF`" ]; then chmod +w $$x; strip $$x; chmod -w $$x; \
  fi \
done;

第一个赋值的问题:

a)  AA = $(shell pwd)
b)  AA = `pwd`
第一种方法赋值是先执行shell命令,将命令运行的结果赋值
第二种方法赋值是先赋值(整个shell命令都当作字符来赋值),再执行命令

所以makefile中第二种方法在当前执行体里无法使用;使用的结果是本执行体会开进程进行执行,执行的结果是在本执行体结束后才有结果

第二个取值的问题;

$var:将Makefile中的变量var的值,传给shell命令。
$$var:访问shell命令中定义的变量var。

在linux的Makefile中,经常会见到$var和$$var的形式,所以无法使用shell的方法

比如获取shell 执行结果:echo "$*"|grep -q "test";echo "test:" $$?

@echo "$*"|grep -q "test";\

    if [ $$? ]; then \

        echo "test1";\

        else \

        echo "test2";\

        fi

等同于:

LOADER_CHECK=$(shell echo "$*"|grep -q "test")

    @if [ -z $(LOADER_CHECK) ]; then \

        echo "test1";\

        else \

        echo "test2";\

        fi

第三个问题:

for x in ${ALL_FILES}; \ 必须有;作为单独的语句来执行,而shell 没有那么严谨,可以不使用。

关于Makefile shell 当成变量来应用的时候,进入执行体前会先执行shell,赋值给变量使用,比如:

.PHONY:create_rootfs
create_rootfs:

    @if [ -d ${TEST_ROOTFS} ];then \
        rm -rf ${TEST_ROOTFS}/*;\
    else \
        mkdir -p ${TEST_ROOTFS};\
    fi
    @mkdir -p ${TEST_ROOTFS}/usr/local/stb/external-ko    
    @cp -arf ${LOADER_PUB_DIR}/rootfs/* ${TEST_ROOTFS}/

prefs:create_rootfstfs
    @echo "create fs"
    @find ${TEST_ROOTFS} -name .git | xargs rm -f
    @for x in $(shell find ${TEST_ROOTFS}/ -type f) ;\
         do \
           if [ -n "`file $$x | grep ELF`" ]; then \
             chmod +w $$x; \
             ${STRIP} ${STRIP_DEBUG} $$x; \
             chmod -w $$x; \
           fi \
   done

如果把执行体create_rootfs 内容放到prefs里面去执行,那么$(shell find ${TEST_ROOTFS}/ -type f) 会在进入执行体prefs前执行,结果就是没有文件或者没有目录。如果把create_rootfstfs单独放在外面先执行,那么在进入create_rootfs前会先执行$(shell find ${TEST_ROOTFS}/ -type f) 就不会有问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值