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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:12:49