如何在不支持.ONESHELL的低版本Makefile中执行cd切换目录?
Makefile 低版本无
.ONESHELL时执行目录切换的实现方法 Make默认会为规则下的每一行命令单独启动独立shell子进程,单独一行书写cd moocs/libs/bin时,目录切换仅在当前行的子shell中生效,子进程退出后工作目录会回到make启动时的初始路径,这是shell子进程的基础工作机制,不依赖.ONESHELL特性也可以通过以下全版本兼容的写法实现需求:
- 单行命令串联:将
cd操作和需要在目标目录下执行的命令写在同一行,用&&连接即可。使用&&时前序命令执行失败会直接终止后续流程,避免在错误目录执行操作:
run_app: cd moocs/libs/bin && ./start_service.sh
注意:Makefile规则内的命令行必须以Tab字符开头,不能用空格替代,否则会触发语法错误。
- 反斜杠续接长命令:如果需要执行的操作较多,单行书写可读性差,可以在每一行末尾添加反斜杠
\续行,续接后的所有行会被合并到同一个shell会话中执行,和单行书写效果完全一致,兼容所有发布版本的make:
run_app: cd moocs/libs/bin && \ ls -l && \ chmod +x start_service.sh && \ ./start_service.sh
如果多个目标规则都需要在该目录下执行操作,可以提前将目录路径定义为变量,减少重复代码:
BIN_DIR := moocs/libs/bin check_env: cd $(BIN_DIR) && ./check_dep.sh start: cd $(BIN_DIR) && ./start_service.sh stop: cd $(BIN_DIR) && ./stop_service.sh
注意:不存在独立书写一行cd就能让make进程永久切换工作目录的写法,所有目录切换的作用域仅限同一个shell会话内的后续命令。
内容的提问来源于stack exchange,提问作者É.Galois
相关产品推荐
相关产品推荐

