我有一个Bash脚本,需要知道它的完整路径。我正试图找到一个广泛兼容的方式来做到这一点,而不是以相对的或看起来很怪异的路径结束。我只需要支持Bash,而不是sh、csh等
到目前为止我发现:
接受的对Getting the source directory of a Bash script from within的回答是通过dirname $0
获取脚本路径,这很好,但这可能会返回一个相对路径(类似于.
),如果要更改脚本中的目录并且路径仍然指向脚本的目录,这是一个问题。不过,dirname
仍然是谜团的一部分。
对Bash script absolute path with OS X的公认答案(OS X特定,但答案是有效的)给出了一个函数,该函数将测试$0
是否看起来是相对的,如果是这样,则将预先依赖于它。但是结果仍然可以包含相对位(尽管总体上是绝对的)-例如,如果脚本在目录/usr/bin
中,而您在/usr
中,并且您键入bin/../bin/t
来运行它(是的,这是复杂的),那么您最终将/usr/bin/../bin
作为脚本的目录路径。它可以工作,但是。。。
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系统进行检查)。
所以,做这件事的方式多种多样,但他们都有自己的注意事项。
有什么更好的方法?其中“更好”是指:
我很惊讶这里没有提到
realpath
命令。我的理解是它是广泛可移植的。最初的解决方案是:
并根据您的喜好保留未解析的符号链接:
我发现在Bash中获取完整规范路径的最简单方法是使用
cd
和pwd
:使用
${BASH_SOURCE[0]}
而不是$0
会产生相同的行为,而不管脚本是作为<name>
还是source <name>
调用的。以下是我所提出的(编辑:加上由sfstewman、levigroker、Kyle Strand和Rob Kennedy提供的一些调整),这些似乎基本上符合我的“更好”标准:
该
SCRIPTPATH
行看起来特别迂回,但我们需要它而不是SCRIPTPATH=`pwd`
,以便正确处理空格和符号链接。还要注意的是,一些深奥的情况,比如执行一个根本不是来自可访问文件系统中的文件的脚本(这是完全可能的),并没有在那里得到满足(或者在我看到的任何其他答案中)。
相关问题 更多 >
编程相关推荐