【发布时间】:2011-06-14 00:41:23
【问题描述】:
我有一个需要知道其完整路径的 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是否看起来是相对的,如果是这样,将在它前面加上$PWD。但是结果中仍然可以包含相对位(尽管总体而言它是绝对的)——例如,如果脚本是目录/usr/bin中的t并且您在/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 的系统来检查)。
所以,有各种方法,但它们都有自己的警告。
有什么更好的方法?其中“更好”的意思是:
- 给我绝对路径。
- 即使在以复杂的方式调用时也能去掉时髦的位(参见上面对#2 的评论)。 (例如,至少适度规范化路径。)
- 仅依赖于 Bash 主义或几乎可以肯定是最流行的 *nix 系统(GNU/Linux、BSD 和类似 BSD 的系统,如 OS X 等)的东西。
- 尽可能避免调用外部程序(例如,首选 Bash 内置程序)。
- (已更新,感谢您的提醒,wich)它不必解析符号链接(事实上,我更希望它不理会它们,但这不是要求)。
【问题讨论】:
-
请看BashFAQ/028。
-
上述解决方案#3 中的链接已失效。谁有更新的?
-
$(readlink -f $0) - 不适用于 Mac OS 10.9.2
-
(1.) link you give in your own question 有大约 10 次问题投票,10 次收藏,>15 次回答投票。 (2.) 你的总结有些虚伪。 (您提供的链接的第一个修订答案是“DIRECTORY=$(cd
dirname $0&& pwd)”......这与您的摘要“通过 dirname $0 获取脚本的路径”不匹配,并且不符合您所说的“返回相对路径”。) -
这不完全是 stackoverflow.com/questions/59895/… 的副本。该问题要求源目录,其中还可能包括相对路径(正如一些建议
$0的答案所证明的那样)。这个问题具体是绝对路径,不一样。