【问题标题】:How to get the full pathname of the current shell script?如何获取当前 shell 脚本的完整路径名?
【发布时间】:2011-01-28 17:45:29
【问题描述】:

有没有更简单的方法来做到这一点?

#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT

我一直在使用 ksh,但我更喜欢在 bash 中也可以使用的解决方案(我认为确实如此)。

【问题讨论】:

  • @Carl:不确定你的意思。 $0 是脚本的名称,但可以是绝对路径或相对路径。
  • 你是对的 - 你只关心被执行的路径名。删除其他 cmets。
  • @Carl,实际上我认为您对硬链接有很好的看法。我没想到他们。
  • 是的,不过这种情况很少见。对于您正在寻找的目的,它们并不重要,对吧?任何一个好的路径都可以,特别是正在执行的路径名将通过您的检查找到,所以应该是好的。

标签: bash ksh pathname


【解决方案1】:

为什么在我问这个问题之前我没想过尝试一下?

THIS_SCRIPT=$(/usr/bin/readlink -nf "$0")

效果很好。

【讨论】:

    【解决方案2】:

    Entry #28 在 bash 常见问题解答中:

    如何确定脚本的位置?我想从同一个地方读取一些配置文件。

    出现此问题的主要原因有两个:要么您想将数据或脚本配置外部化,并且需要一种方法来查找这些外部资源,要么您的脚本旨在针对某种捆绑包(例如. 一个构建脚本),并且需要找到要采取行动的资源。

    重要的是要认识到,在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及将在下面详述的任何方法都有缺陷,并且仅在特定情况下有效。首先,尽量避免这个问题,不要依赖脚本的位置!

    ...

    使用 BASH_SOURCE

    BASH_SOURCE 内部 bash 变量实际上是一个路径名数组。如果您将其扩展为一个简单的字符串,例如"$BASH_SOURCE",你会得到第一个元素,它是当前正在执行的函数或脚本的路径名。

    【讨论】:

    • 哇...我真的不想走那么远的兔子洞,但这是一个很好的答案。我将坚持使用我的 readlink 解决方案,因为它对于我正在做的事情来说已经足够好了,但我会接受这个答案。
    • 这将是条目摘要的更好答案。
    【解决方案3】:

    我一直这样做:

    SCRIPT_PATH=$(cd `dirname ${0}`; pwd)
    

    我以前从未使用过 readlink:它只是 Gnu 吗? (即它可以在 HP-UX、AIX 和 Solaris 上开箱即用吗?dirname 和 pwd 可以......)

    (编辑添加了我在原始帖子中忘记的``。d'oh!) (编辑 2 以放置两行,当我查看以前编写的脚本时,我显然总是这样做,但没有正确记住。第一次调用获取路径,第二次调用消除了相对路径) (编辑 3 个阻止单行答案工作的固定错字,回到单行!)

    【讨论】:

      【解决方案4】:

      在我使用的 macOS 中(编辑:仅当您从脚本实际所在的位置运行脚本时才有效!)

      my_script=$(pwd)/$(basename $0)

      【讨论】:

      • 除非您的工作目录恰好与脚本所在的位置相同,否则不起作用。
      猜你喜欢
      • 2010-10-11
      • 2010-11-25
      • 2016-06-05
      • 2018-04-13
      • 1970-01-01
      • 2015-05-16
      • 2015-09-23
      • 1970-01-01
      相关资源
      最近更新 更多