有没有更暴力的方法来做到这一点?
#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT
我坚持使用ksh
,但更喜欢一个也适用的解决方案bash
(我认为这样做)。
bash 常见问题解答中的条目 #28 :
如何确定脚本的位置?我想从同一个地方读取一些配置文件。
出现此问题的主要原因有两个:您想要外部化脚本的数据或配置并且需要一种方法来查找这些外部资源,或者您的脚本旨在对某种捆绑包(例如,构建脚本),并且需要找到要采取行动的资源。
重要的是要认识到,在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及将在下面详述的任何方法都有缺陷,并且仅在特定情况下有效。首先,不要依赖脚本的位置,尽量避免这个问题!
...
使用 BASH_SOURCE
BASH_SOURCE 内部 bash 变量实际上是一个路径名数组。如果你将它展开为一个简单的字符串,例如“$BASH_SOURCE”,你会得到第一个元素,它是当前正在执行的函数或脚本的路径名。
我一直这样做:
SCRIPT_PATH=$(cd `dirname ${0}`; pwd)
我以前从未使用过 readlink:它只是 Gnu 吗?(即,它可以在 HP-UX、AIX 和 Solaris 上开箱即用吗?dirname 和 pwd 将....)
(编辑添加了我在原始帖子中忘记的 ``。d'oh!)(编辑 2 以添加两行,当我查看以前编写的脚本时,我显然总是这样做,但没有正确记住. 第一次调用获取路径,第二次调用消除了相对路径)(编辑 3 固定错字,阻止单行回答工作,回到单行!)
为什么在我问这个问题之前我没有想过尝试这个?
THIS_SCRIPT=$(/usr/bin/readlink -nf "$0")
效果很好。
在我使用的 macOS 中(编辑:仅当您从脚本实际所在的位置运行脚本时才有效!)
my_script=$(pwd)/$(basename $0)