最佳答案
我有一个Bash脚本需要知道它的完整路径。我正在努力找到一种广泛兼容的方式来做到这一点,而不会以相对或看起来很时髦的路径告终。我只需要支持Bash,而不是sh、csh等。
到目前为止我发现:
从内部获取Bash脚本的源目录解决了通过dirname $0
获取脚本路径的问题,这很好,但这可能会返回一个相对路径(如.
),如果您想更改脚本中的目录并使路径仍然指向脚本的目录,这将是一个问题。尽管如此,dirname
仍将是难题的一部分。
使用OS X的Bash脚本绝对路径的可接受答案(OS X特定,但答案无论如何都有效)给出了一个函数,该函数将测试$0
是否看起来是相对的,如果是,则会预先将$PWD
推迟到它。但结果仍然可以有相对位(尽管总体上它是绝对的)-例如,如果脚本是目录/usr/bin
中的t
,而你在/usr
中并且你键入bin/../bin/t
来运行它(是的,这很复杂),你最终会得到/usr/bin/../bin
作为脚本的目录路径。哪个工作,但是…
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的系统进行检查)。
所以,有各种各样的方法,但他们都有自己的警告。
什么是更好的方法?“更好”的意思是: