为了账号安全,请及时绑定邮箱和手机立即绑定

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

/ 猿问

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

噜噜哒 2019-08-23 14:22:32

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内置程序)。

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


查看完整描述

3 回答

?
墨色风雨

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


您的初始解决方案变为


SCRIPT=`realpath $0`

SCRIPTPATH=`dirname $SCRIPT`

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


SCRIPT=`realpath -s $0`

SCRIPTPATH=`dirname $SCRIPT`


查看完整回答
反对 回复 2019-08-23
?
达令说

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

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

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


查看完整回答
反对 回复 2019-08-23
  • 3 回答
  • 0 关注
  • 262 浏览
我要回答

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信