红联Linux门户
Linux帮助

在makefile中执行shell需要注意

发布时间:2016-10-19 11:22:21来源:linux网站作者:groundhappy
1.执行的时候一行就是一个shell。所以一个完整的shell命令必须在一行之内,因此要用\连接起来。
比如
if [ "$(obj)X" = "fsX" ]; then \
echo "ONE1 $(KBUILD_BUILTIN)"; \
echo "ONE2 $(builtin-target)"; \
echo "ONE3 $(lib-target)"; \
echo "ONE4 $(extra-y)"; \
echo "ONE5 $(subdir-ym)"; \
echo "ONE6 $(always)"; \
fi
在shell命令的一行末尾一般可以看到 ;\   
每一个完毕的shell之后最好用;结尾。不然容易出现各种问题
比较时不能用==,需要用= (这里还是有点疑问)
 
2.由于shell命令一般有点长。最好采用命令定义和执行分开的形式。
比如
定义
shellcmd=if [ "$(obj)X" = "fsX" ]; then \
echo "ONE1 $(KBUILD_BUILTIN)"; \
echo "ONE2 $(builtin-target)"; \
echo "ONE3 $(lib-target)"; \
echo "ONE4 $(extra-y)"; \
echo "ONE5 $(subdir-ym)"; \
echo "ONE6 $(always)"; \
fi
执行
$(shellcmd)
这样比较清楚
 
3.shell传递变量。
如果是一个$符号,传递的是Makefile中的变量
如果是两个$。传递的是shell中的变量。
比如Makefile中有
data=1 (E)
all:
@echo ${data}; (A)
@data=2; (B)
@echo ${data}; (C)
@echo $${data}; (D)
(A)输出 1
(B)是一个单独的shell行,定义了data=1,不会影响到makefile中的data (E)的变量。
(C)输出1 ,因为B的修改是修改的shell里面的变量。不是makefile中的
(D)输出空行 Makefile中的echo $$data 等于shell里面执行 echo $data,由于这一行的shell data是没有定义的,所以输出空行,(B)的定义和(D)不是同一个shell。
可以用 \将不同行的连接为同一个shell
data=1 (E)
all:
@echo ${data}; (A)
@data=2; \ (B)
echo ${data}; \ (C)
echo $${data}; (D)
(A) 输出1,也即是(E)
(B) (C) (D)用\连接起来。所以属于同一个shell
(C)输出的还是1(E)。
(D)输出的是2.也就是(B),因为他们属于同一个shell。echo $${data} 交给shell解释的时候变成了 echo ${data}。此时${data}是B的2。
 
本文永久更新地址:http://www.linuxdiyf.com/linux/25180.html