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) 就不会有问题。