获取正在执行 Shell 脚本的绝对路径
2019-12-07 本文已影响0人
舌尖上的大胖
背景
在使用 Shell 脚本的过程中,经常有获取脚本位置的需求,比如操作脚本相对位置的资源。但是在实际获取时存在各种问题,网上的资料也常常有所偏颇,比如:
- 执行方式不同带来的差异,如通过当前 Shell 来执行,即以
source 脚本文件
或. 脚本文件
的方式执行,导致不能以$0
来获取 -
pwd
命令只能获取当前工作路径
,跟脚本位置无关 - 一些通过改变当前路径的方式,会导致影响执行环境,不理想
- 操作系统的差异,如:macOS 或 Linux
本文的方法适用于 bash
、sh
两种 Shell。
解决方案
# 获取 shell 脚本绝对路径
script_path() {
# 操作系统类型
local os_name=$(uname)
# 脚本名称
local bash_source_name=${BASH_SOURCE[0]}
local script_file=''
# Linux 系统通过 readlink 来获取脚本文件完整路径
if [[ "${os_name}" == "Linux" ]]; then
script_file=$(readlink -f "${bash_source_name}")
fi
# macOS 系统(也可以通过 brew install coreutils 安装 greadlink 的方式解决)
if [[ "${os_name}" == "Darwin" ]]; then
# 如果以 / 开头则认为是绝对路径
if [[ $(echo ${bash_source_name} | awk '/^\//') == ${bash_source_name} ]]; then
script_file=${bash_source_name}
else # 否则在脚本路径前面加上 当前路径
script_file=$PWD/${bash_source_name}
fi
fi
echo $script_file
}
备选方案
Linux 系统通过 readlink 来获取脚本文件完整路径,但是 macOS 系统的 readlink 没有 -f
参数,所以也可以通过 brew install coreutils
安装 greadlink
的方式解决。
参考资料
(完)