<分区>
我有一个 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)它不必解析符号链接(symbolic link)(事实上,我更希望它让它们单独存在,但这不是要求)。