Bash脚本开发:未找到Makefile时保存目录并拼接文件路径
看起来你想写一个脚本,自动向上查找Makefile,然后把目标文件的**相对路径(从Makefile所在目录出发)**添加到Makefile里对吧?你的初始思路方向是对的,但需要调整逻辑来可靠处理路径记录,这里给你一个完善后的版本:
#!/bin/bash # 检查用户是否传入了目标文件参数 if [ $# -ne 1 ]; then echo "Usage: $0 <target-file>" exit 1 fi # 将目标文件转换为绝对路径,避免目录切换后找不到 target_file=$(realpath "$1") if [ ! -f "$target_file" ]; then echo "Error: Target file '$1' does not exist." exit 1 fi # 保存起始目录,最后要回到这里 start_dir=$(pwd) makefile_dir="" relative_path="" # 循环向上查找Makefile while true; do # 检查当前目录是否有Makefile if [ -f "./Makefile" ]; then makefile_dir=$(pwd) # 计算从Makefile目录到目标文件的相对路径 relative_path=$(realpath --relative-to="$makefile_dir" "$target_file") break fi # 如果到了根目录还没找到,退出报错 current_dir=$(pwd) if [ "$current_dir" = "/" ]; then echo "Error: No Makefile found in any parent directory." cd "$start_dir" exit 1 fi # 切换到父目录继续查找 cd .. done # 将相对路径添加到Makefile中(这里假设你要加到SRCS变量,可根据需求修改) echo "SRCS += $relative_path" >> "$makefile_dir/Makefile" echo "Successfully added '$relative_path' to $makefile_dir/Makefile" # 回到起始目录 cd "$start_dir"
关键逻辑说明
- 参数与文件校验:先确保用户传入了目标文件,同时检查文件是否存在,避免无效操作。
- 绝对路径转换:用
realpath把目标文件转成绝对路径,这样后续切换目录时不会丢失文件定位。 - 逐层查找Makefile:从当前目录开始向上遍历,直到找到Makefile或到达根目录(防止无限循环)。
- 自动计算相对路径:找到Makefile后,用
realpath --relative-to直接生成从Makefile目录到目标文件的相对路径,这比手动拼接目录更可靠,能处理跨目录、符号链接等复杂场景。 - 恢复初始目录:脚本运行结束后回到用户最初的工作目录,避免打乱操作环境。
可选优化
如果需要避免重复添加同一个文件,可以在追加前加个检查:
if ! grep -q "$relative_path" "$makefile_dir/Makefile"; then echo "SRCS += $relative_path" >> "$makefile_dir/Makefile" echo "Successfully added '$relative_path' to $makefile_dir/Makefile" else echo "Warning: '$relative_path' is already in $makefile_dir/Makefile" fi
内容的提问来源于stack exchange,提问作者Zangalewa
相关产品推荐
相关产品推荐

