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

RedHat 6 Bash环境下获取被source脚本目录时readlink报错的解决方法

解决RedHat 6下获取被source脚本路径的问题

嘿,这个问题我太熟悉了!RedHat 6自带的readlink是比较老旧的版本,根本不支持-f参数——这就是你看到readlink: invalid option -- 'b'报错的原因(其实是解析-f时出了问题,错误提示有点误导)。而且还有个小坑:当脚本被source执行时,$0指向的是当前shell进程(比如bash),而非脚本本身,所以就算readlink -f能用,结果也不对。

下面给你几个靠谱的替代方案:

方案一:纯Bash内置方法(推荐,无需额外工具)

写一个小函数处理符号链接和绝对路径,用BASH_SOURCE[0]替代$0,这是获取被source脚本路径的正确姿势:

get_script_dir() {
    local script_path="${BASH_SOURCE[0]}"
    # 循环解析符号链接,直到找到真实文件
    while [ -h "$script_path" ]; do
        local parent_dir="$(cd -P "$(dirname "$script_path")" && pwd)"
        script_path="$(readlink "$script_path")"
        # 如果符号链接是相对路径,拼接绝对路径
        [[ $script_path != /* ]] && script_path="$parent_dir/$script_path"
    done
    # 获取脚本所在的绝对目录
    local script_dir="$(cd -P "$(dirname "$script_path")" && pwd)"
    echo "$script_dir"
}

# 调用函数获取路径
DIR=$(get_script_dir)
echo "脚本所在目录:$DIR"

这个函数完全依赖Bash内置命令和系统自带工具,不需要安装任何额外软件,兼容性拉满。

方案二:用Python快速实现(简洁)

RedHat 6默认自带Python 2.6,用一行Python命令就能搞定,不用写复杂循环:

DIR=$(python -c "import os; print(os.path.dirname(os.path.abspath(os.path.realpath('${BASH_SOURCE[0]}'))))")
echo "脚本所在目录:$DIR"

Python的os.path.realpath会自动解析所有符号链接,abspath确保路径是绝对路径,最后用dirname提取目录,逻辑清晰又简洁。

为什么不推荐升级readlink?

虽然新版本GNU coreutils的readlink支持-f参数,但在RedHat 6上升级coreutils可能破坏系统自带的依赖关系,风险较高,所以优先用上面两个方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:20:55