Bash脚本获得其完整路径的可靠方法

2024-04-26 22:06:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Bash脚本,需要知道它的完整路径。我正试图找到一个广泛兼容的方式来做到这一点,而不是以相对的或看起来很怪异的路径结束。我只需要支持Bash,而不是sh、csh等

到目前为止我发现:

  1. 接受的对Getting the source directory of a Bash script from within的回答是通过dirname $0获取脚本路径,这很好,但这可能会返回一个相对路径(类似于.),如果要更改脚本中的目录并且路径仍然指向脚本的目录,这是一个问题。不过,dirname仍然是谜团的一部分。

  2. Bash script absolute path with OS X的公认答案(OS X特定,但答案是有效的)给出了一个函数,该函数将测试$0是否看起来是相对的,如果是这样,则将预先依赖于它。但是结果仍然可以包含相对位(尽管总体上是绝对的)-例如,如果脚本在目录/usr/bin中,而您在/usr中,并且您键入bin/../bin/t来运行它(是的,这是复杂的),那么您最终将/usr/bin/../bin作为脚本的目录路径。它可以工作,但是。。。

  3. readlink解决方案on this page,如下所示:

    # Absolute path to this script. /home/user/bin/foo.sh
    SCRIPT=$(readlink -f $0)
    # Absolute path this script is in. /home/user/bin
    SCRIPTPATH=`dirname $SCRIPT`
    

    但是readlink不是POSIX,而且显然解决方案依赖于GNU的readlink,其中BSD由于某种原因无法工作(我无法访问BSD-like系统进行检查)。

所以,做这件事的方式多种多样,但他们都有自己的注意事项。

有什么更好的方法?其中“更好”是指:

  • 给我绝对的路径。
  • 即使以一种复杂的方式调用,也会去掉一些时髦的位(请参阅上面对#2的评论)。(例如,至少适度规范化路径。)
  • 只依赖于Bash isms或几乎可以确定是最流行的*nix系统(GNU/Linux、BSD和类似BSD的系统,如OS X等)。
  • 尽可能避免调用外部程序(例如,首选Bash内置程序)。
  • 已更新,感谢您的提醒,wich)它不需要解析符号链接(事实上,我希望它让它们单独存在,但这不是必需的)。

Tags: path路径目录脚本bashbinosusr
3条回答

我很惊讶这里没有提到realpath命令。我的理解是它是广泛可移植的。

最初的解决方案是:

SCRIPT=`realpath $0`
SCRIPTPATH=`dirname $SCRIPT`

并根据您的喜好保留未解析的符号链接:

SCRIPT=`realpath -s $0`
SCRIPTPATH=`dirname $SCRIPT`

我发现在Bash中获取完整规范路径的最简单方法是使用cdpwd

ABSOLUTE_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)/$(basename "${BASH_SOURCE[0]}")"

使用${BASH_SOURCE[0]}而不是$0会产生相同的行为,而不管脚本是作为<name>还是source <name>调用的。

以下是我所提出的(编辑:加上由sfstewmanlevigrokerKyle StrandRob Kennedy提供的一些调整),这些似乎基本上符合我的“更好”标准:

SCRIPTPATH="$( cd "$(dirname "$0")" ; pwd -P )"

SCRIPTPATH行看起来特别迂回,但我们需要它而不是SCRIPTPATH=`pwd`,以便正确处理空格和符号链接。

还要注意的是,一些深奥的情况,比如执行一个根本不是来自可访问文件系统中的文件的脚本(这是完全可能的),并没有在那里得到满足(或者在我看到的任何其他答案中)。

相关问题 更多 >