Bash脚本获取自身完整路径的可靠方式
我有一个Bash脚本需要知道它的完整路径。我试图找到一种广泛兼容的方式来做到这一点,而不会结束相对或时髦的路径。我只需要支持Bash,而不是sh,csh等。
到目前为止我发现了什么:
从地址中获取Bash脚本的源目录的接受答案是获取脚本的路径dirname $0
,这很好,但可能会返回相对路径(如.
),如果您想更改目录中的目录,这是一个问题脚本并使路径仍指向脚本的目录。不过,dirname
将成为这个难题的一部分。
对OS X的Bash脚本绝对路径 的接受答案(特定于OS X,但答案无论如何)都会给出一个函数,该函数将测试是否$0
看起来相对,如果是,则会预先挂起$PWD
。但是结果仍然可以包含相对位(虽然总体来说它是绝对的) - 例如,如果脚本t
在目录中/usr/bin
并且你进入/usr
并且你输入bin/../bin/t
它来运行它(是的,那是复杂的),你最终会得到/usr/bin/../bin
as脚本的目录路径。哪个有效,但......
此页面上的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内置程序)。
(更新,感谢抬起头,至极)它没有解决符号链接(其实,我倒是那种喜欢它,离开他们独自一人,但是这不是必须的)。
墨色风雨
达令说
相关分类