确定正在执行的 BASH 脚本的路径

在 Windows 命令脚本中,可以使用 %~dp0确定当前正在执行的脚本的 目录路径。例如:

@echo Running from %~dp0

BASH脚本中的等价物是什么?

171451 次浏览

对于相对路径(即 Windows 的 %~dp0的直接等价物) :

MY_PATH="$(dirname -- "${BASH_SOURCE[0]}")"
echo "$MY_PATH"

对于绝对的规范化路径:

MY_PATH="$(dirname -- "${BASH_SOURCE[0]}")"            # relative
MY_PATH="$(cd -- "$MY_PATH" && pwd)"    # absolutized and normalized
if [[ -z "$MY_PATH" ]] ; then
# error; for some reason, the path is not accessible
# to the script (e.g. permissions re-evaled after suid)
exit 1  # fail
fi
echo "$MY_PATH"

假设您键入 bash 脚本的完整路径,使用 $0dirname,例如:

#!/bin/bash
echo "$0"
dirname "$0"

输出示例:

$ /a/b/c/myScript.bash
/a/b/c/myScript.bash
/a/b/c

如果需要,将 $PWD变量的结果追加到相对路径。

编辑: 添加引号来处理空格字符。

< em > Stephane CHAZELAS 提供。 假设 POSIX shell:

prg=$0
if [ ! -e "$prg" ]; then
case $prg in
(*/*) exit 1;;
(*) prg=$(command -v -- "$prg") || exit;;
esac
fi
dir=$(
cd -P -- "$(dirname -- "$prg")" && pwd -P
) || exit
prg=$dir/$(basename -- "$prg") || exit


printf '%s\n' "$prg"

弗拉德的代码被过度引用了,应该是:

MY_PATH=`dirname "$0"`
MY_PATH=`( cd "$MY_PATH" && pwd )`
echo Running from `dirname $0`