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
相关产品推荐
相关产品推荐

