如何使用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
相关产品推荐
相关产品推荐

