You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不支持.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 14:30:44