bash脚本如何知道它来源时安装的目录.运营商?

Gar*_*ary 12 unix linux bash shell scripting

我想要做的是将文件中的设置包含到我当前的交互式bash shell中,如下所示:

$./path/to/some/dir/.settings

问题是.settings脚本还需要使用".".运算符包含其他文件,如下所示:

..extra_settings

如何在.settings文件中引用.extra_settings的相对路径?这两个文件始终存储在同一目录中,但此目录的路径将根据这些文件的安装位置而有所不同.

操作员总是知道/ path/to/some/dir /,如上所示..settings文件如何知道安装它的目录?我宁愿没有一个记录已安装目录名称的安装过程.

Jas*_*Day 19

我相信$(dirname "$BASH_SOURCE")你会做你想要的,只要你采购的文件不是符号链接.

如果您要获取的文件可能是符号链接,则可以执行以下操作以获取真实目录:

PRG="$BASH_SOURCE"
progname=`basename "$BASH_SOURCE"`

while [ -h "$PRG" ] ; do
    ls=`ls -ld "$PRG"`
    link=`expr "$ls" : '.*-> \(.*\)$'`
    if expr "$link" : '/.*' > /dev/null; then
        PRG="$link"
    else
        PRG=`dirname "$PRG"`"/$link"
    fi
done

dir=$(dirname "$PRG")
Run Code Online (Sandbox Code Playgroud)

  • 要解决符号链接,你可以这样做:`dir = $(dirname $(readlink -f"$ BASH_SOURCE"))` (9认同)

Jac*_*Lee 7

这可能是一个优雅的解决方案:

script_path="${BASH_SOURCE[0]}"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
Run Code Online (Sandbox Code Playgroud)

但是,在采购链接时,这不会起作用.在这种情况下,人们可能会这样做

script_path="$(readlink -f "$(readlink "${BASH_SOURCE[0]}")")"
script_dir="$(cd "$(dirname "${script_path}")" && pwd)"
Run Code Online (Sandbox Code Playgroud)

请注意,类似${array[x]}的数组不符合POSIX.当然,该BASH_SOURCE阵列仅在Bash中可用.

  • BASH_SOURCE是一个表示调用堆栈的数组,第一个元素是当前正在执行的脚本. (3认同)