Bash脚本获取自身完整路径的可靠方式

Bash脚本获取自身完整路径的可靠方式

我有一个Bash脚本需要知道它的完整路径。我试图找到一种广泛兼容的方式来做到这一点,而不会结束相对或时髦的路径。我只需要支持Bash,而不是sh,csh等。

到目前为止我发现了什么:

  1. 地址中获取Bash脚本的源目录的接受答案是获取脚本的路径dirname $0,这很好,但可能会返回相对路径(如.),如果您想更改目录中的目录,这是一个问题脚本并使路径仍指向脚本的目录。不过,dirname将成为这个难题的一部分。

  2. OS X的Bash脚本绝对路径 的接受答案(特定于OS X,但答案无论如何)都会给出一个函数,该函数将测试是否$0看起来相对,如果是,则会预先挂起$PWD。但是结果仍然可以包含相对位(虽然总体来说它是绝对的) - 例如,如果脚本t在目录中/usr/bin并且你进入/usr并且你输入bin/../bin/t它来运行它(是的,那是复杂的),你最终会得到/usr/bin/../binas脚本的目录路径。哪个有效,但......

  3. 此页面上的readlink解决方案如下所示:

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

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

所以,各种方式,但他们都有他们的警告。

什么是更好的方式?“更好”的意思是:

  • 给了我绝对的道路。

  • 即使以复杂的方式调用,也可以获得时髦的位(参见上面#2的评论)。(例如,至少要对路径进行适度规范化。)

  • 仅依赖于Bash-isms或几乎肯定会出现在最流行的* nix系统(GNU / Linux,BSD和类似BSD的系统,如OS X等)上的东西。

  • 如果可能,避免调用外部程序(例如,更喜欢Bash内置程序)。

  • 更新,感谢抬起头,至极)它没有解决符号链接(其实,我倒是那种喜欢它,离开他们独自一人,但是这不是必须的)。


噜噜哒
浏览 605回答 3
3回答

墨色风雨

我很惊讶realpath这里没有提到这个命令。我的理解是它广泛便携/移植。您的初始解决方案变为SCRIPT=`realpath $0`SCRIPTPATH=`dirname $SCRIPT`并根据您的偏好保留未解析的符号链接:SCRIPT=`realpath -s $0`SCRIPTPATH=`dirname $SCRIPT`

达令说

我发现在Bash中获得完整规范路径的最简单方法是使用cd和pwd:ABSOLUTE_PATH="$(cd&nbsp;"$(dirname&nbsp;"${BASH_SOURCE[0]}")"&nbsp;&&&nbsp;pwd)/$(basename&nbsp;"${BASH_SOURCE[0]}")"使用${BASH_SOURCE[0]},而不是$0不管脚本是否被调用为产生相同的行为<name>或source <name>。
打开App,查看更多内容
随时随地看视频慕课网APP