Linux 命令行在shell 脚本和Makefile会有些不一样的差别,一个shell是一个进程,shell 脚本的命令都是在shell一个进程进行,前后命令会有所影响;而makefile里的每一行命令是一个单独的进程,只在单行里有影响,不对上下文影响。比如在test 目录下建立一个软链接:
在脚本里执行
#!/bin/bash
cd test
ln -sf /usr/bin/mytest lntest
cd ../
建立软链接成功,但是相同的语法在makefle 就无法成功:
.PHONY testln
testln:
cd test
ln -sf /usr/bin/mytest lntest
cd ../
运行发现,lntest建立的软链接在当前makefile 目录下,而并不在test里面。修改如下:
.PHONY testln
testln:
cd test; ln -sf /usr/bin/mytest lntest
运行后,达到预期,test 目录下建立一个软链接。因此关联的所有命令必须在同一行执行完;如果太长可以加“\” 进行换行拼接处理。例如:
.PHONY testln
testln:
cd test;\
ln -sf /usr/bin/mytest lntest
shell cd改了目录,会作用到后面命令,所以需要cd 返回还原执行目录状态,而Makefile 每行是单独的进程,cd 不会影响到下一行的进程,因此,不需要在cd ../返回到上级目录。