【问题标题】:Valid/robust pattern to find the absolute path of the executing Unix shell script?找到正在执行的 Unix shell 脚本的绝对路径的有效/稳健模式?
【发布时间】:2012-06-14 20:32:57
【问题描述】:

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

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

无论脚本是从绝对路径还是相对路径调用,例如script.sh./script.sh../script.sh../../../lib/script.sh/Users/../scripts/script.sh,从另一个脚本中调用,它似乎都应该完美运行,等等

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

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

【问题讨论】:

    标签: shell unix absolute-path


    【解决方案1】:

    我似乎也一直在为此苦苦挣扎。很遗憾,并非所有平台都支持 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)"
    

    【讨论】:

      【解决方案2】:

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

      另一个是你不一定信任"$0"。例如,如果您的脚本由exec 函数之一加载,则为argv[0] 传入任意字符串是很简单的。我改用"$BASH_SOURCE",尽管这显然是特定于 bash 的。

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

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

      cd "$(dirname "$(readlink -e "$BASH_SOURCE")")" && ABSPATH=$(pwd) && cd - > /dev/null
      

      【讨论】:

      • readlink 在某些系统上不存在,-e 在 OS X 或某些其他 BSD 系统上不起作用。另外,bash 不是在某些系统上不可用吗?
      • @Jake Petroules 是的,我猜你正在寻找可移植性问题,而不是 "$0" 和符号链接的怪癖,我刚刚添加了更多:P
      • 如果他们想在过去为此设置一个环境变量,嗯?
      • 基本上,我已经明白这是一个几乎无法解决的问题。我想最好的解决方案就是简单地记录预期的用途。不过,我会接受您的回答,因为它确实指出了我提出的解决方案存在的问题。
      猜你喜欢
      • 2011-04-07
      • 2014-09-30
      • 2019-07-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 2013-06-26
      • 2019-06-24
      相关资源
      最近更新 更多