命令行工具Bash

获取正在执行 Shell 脚本的绝对路径

2019-12-07  本文已影响0人  舌尖上的大胖

背景

在使用 Shell 脚本的过程中,经常有获取脚本位置的需求,比如操作脚本相对位置的资源。但是在实际获取时存在各种问题,网上的资料也常常有所偏颇,比如:

本文的方法适用于 bashsh 两种 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 的方式解决。

参考资料

(完)

上一篇下一篇

猜你喜欢

热点阅读