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

如何使用Shell脚本在子目录执行make命令后返回主目录执行剩余命令

在Shell脚本中进入子目录执行Makefile并返回主目录的方法

我经常碰到这类需求,下面给你两种靠谱的实现方式,还有一些避坑要点:

方法一:手动切换目录(基础版)

这是最直观的写法,先切换到目标子目录,执行指定的make命令,完成后切回主目录:

#!/bin/bash

# 切换到目标子目录(示例目录名为subdir)
cd subdir || { echo "Failed to enter subdirectory!"; exit 1; }

# 执行带指定目标的make命令
make file_name

# 切回上级主目录
cd ..

# 主目录下的后续命令
echo "Back to main directory, running remaining commands..."
# 在这里添加你的主目录操作,比如make clean、打包等

这里要注意加|| { ... }的判断——如果子目录不存在或者切换失败,脚本会直接报错退出,避免后续命令在错误的目录执行,踩不必要的坑。

方法二:用子shell执行(更优雅)

如果你不想手动写cd ..,可以把子目录里的命令放到子shell中执行——子shell的目录切换不会影响主脚本的当前目录,执行完会自动回到原目录:

#!/bin/bash

# 在子shell中执行子目录的make操作
(
  cd subdir || exit 1
  make file_name
)

# 这里已经自动回到主目录了,直接执行后续命令
echo "Already back in main directory!"
# 你的主目录命令写在这里即可

这种方式更简洁,也避免了忘记写cd ..导致的目录混乱问题,我个人更推荐这种写法。

额外实用要点

  • 如果你的子目录是相对路径,确保脚本执行时的初始工作目录是你期望的主目录(不要在无关目录随便跑这个脚本)
  • 要是需要给make传递参数,直接追加在命令后面就行,比如make file_name CC=gcc CFLAGS=-O2
  • 如果要批量处理多个子目录,可以用循环简化操作:
#!/bin/bash
for dir in subdir1 subdir2 subdir3; do
  (
    cd "$dir" || continue
    echo "Building target in $dir..."
    make file_name
  )
done

# 所有子目录处理完成后,执行主目录的命令
make main_project_target

内容的提问来源于stack exchange,提问作者Vinayak Shrivastava

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:47:50