1

在某处(我不记得在哪里)阅读后,我一直在使用这种技术来获取正在运行的 shell 脚本的绝对物理路径。

cd $(dirname "$0") && ABSPATH=$(pwd) && cd - > /dev/null

无论脚本是从绝对路径还是相对路径调用,它似乎都应该完美地工作,即,,,,,,,从另一个script.sh脚本中,等等。./script.sh../script.sh../../../lib/script.sh/Users/../scripts/script.sh

事实上,这种技术似乎是一种非常可靠的模式,用于绝对化任何相对路径。

我知道出于某种原因,很多用于执行此操作的技术往往不适用于一个系统或另一个系统。那么,这种技术是否存在兼容性问题?它应该适用于几乎所有的 Unix 操作系统和外壳,还是有一些潜在的问题?

4

2 回答 2

0

一个潜在的问题是它不会遵循符号链接(也就是说,如果"$0"实际上是脚本的符号链接,您将获得包含符号链接的目录,而不是包含脚本的实际目录)。

另一个是你不一定信任"$0"。例如,如果您的脚本是由其中一个函数加载的exec,那么将任意字符串传递给argv[0]. 我"$BASH_SOURCE"改用它,尽管这显然是特定于 bash 的。

您缺少 "s around $(dirname "$0"),因此如果目录名称例如包含空格,它将不起作用。

我相信这可以解决这些问题:

cd "$(dirname "$(readlink -e "$BASH_SOURCE")")" && ABSPATH=$(pwd) && cd - > /dev/null
于 2012-06-11T23:26:45.570 回答
0

我似乎也一直在为此苦苦挣扎。很遗憾,并非所有平台都支持 readlink -f|e ...

以下工作并且是便携式的。它支持相对和嵌套的符号链接(因此我们进入目录的 while 循环。

path="${BASH_SOURCE[0]}" current="$PWD"
while [ -L "$path" ] ; do cd "$(dirname "$path")" ; path="$(readlink "$(basename "$path")")"; done
ABSPATH="$( cd "$(dirname "$path")" ; pwd -P)"
cd "$current"

有大量的分叉正在进行,它不是单行的,所以我不会认为它是一个理想或优雅的解决方案......但这里是用于互联网的,我会看看我是否可以随着时间的推移而改进。

过去我使用过以下模式(适用于绝对符号链接);

local path="${BASH_SOURCE[0]}"
while [ -L "$path" ] ; do path="$(readlink "$path")" ; done
ABSPATH="$( cd "$(dirname "$path")" ; pwd -P)"

但现在大多使用

ABSPATH="$( cd "$(dirname "${BASH_SOURCE[0]}")/.." ; pwd -P)"
于 2021-06-17T21:50:28.023 回答