如何获取正在获取的 sh 文件的真实路径

EnZ*_*nZo 3 command-line bash scripts paths windows-subsystem-for-linux

我将此行添加到我的 ~/.bashrc

. /mnt/c/Users/enzo/drive/projects/dotfiles/init.sh
Run Code Online (Sandbox Code Playgroud)

并且在 init.sh 中,我正在尝试获取路径,init.sh但无法获取。

到目前为止我试过这个:

CURDIR=`/bin/pwd`
BASEDIR=$(dirname $0)
ABSPATH=$(readlink -f $0)
ABSDIR=$(dirname $ABSPATH)
REAL=$(realpath $0)

echo "CURDIR is $CURDIR"
echo "BASEDIR is $BASEDIR"
echo "ABSPATH is $ABSPATH"
echo "ABSDIR is $ABSDIR"
echo "REAL is $REAL"
Run Code Online (Sandbox Code Playgroud)

输出:

CURDIR is /mnt/c/Users/enzo
BASEDIR is /bin
ABSPATH is /bin/bash
ABSDIR is /bin
REAL is /bin/bash
Run Code Online (Sandbox Code Playgroud)

我在 linux 的 windows 子系统下。

Rav*_*ina 6

只需使用BASH_SOURCE而不是$0

realpath ${BASH_SOURCE}
Run Code Online (Sandbox Code Playgroud)

在你的脚本中:

REAL=$(realpath ${BASH_SOURCE})
Run Code Online (Sandbox Code Playgroud)


Byt*_*der 6

当您采购一个bash脚本,$0将不会持有你的执行的脚本的名称,但bash可执行文件的。

您应该改为读取的值$BASH_SOURCE,以便脚本目录的绝对路径为

SCRIPT_DIR="$(realpath "$(dirname "$BASH_SOURCE")")"
Run Code Online (Sandbox Code Playgroud)

相关:在 $0 和 BASH_SOURCE 之间进行选择(堆栈溢出)