2010-03-17 73 views
4

有没有一种不那么蛮力的方式来做到这一点?如何获取当前shell脚本的完整路径名?

#!/bin/ksh 
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,")) 
echo $THIS_SCRIPT 

我坚持使用ksh但我们更希望在bash过工作(我认为这确实)的解决方案。

+0

@Carl:不知道你的意思。 $ 0是脚本的名称,但可能是绝对路径或相对路径。 – Dan

+0

你是对的 - 你只关心被执行者的路径名。删除其他评论。 –

+0

@Carl,其实我以为你对硬链接有一个好点。我没有想过他们。 – Dan

回答

5

Entry #28在bash的常见问题解答:

我如何确定我的脚本的位置?我想从同一个地方读取一些配置文件。

出现此问题的原因主要有两个:要么是外部化数据或配置脚本,需要一种方法来查找这些外部资源,或者您的脚本旨在处理某种类型的捆绑例如构建脚本),并且需要找到要采取行动的资源。

重要的是要认识到,在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及将在下面详细介绍的任何方法都存在缺陷,并且只会在特定情况下起作用。首先,尽量避免这个问题完全取决于脚本的位置!

...

使用BASH_SOURCE

的BASH_SOURCE内部的bash变量实际上是路径名的阵列。如果您将其展开为一个简单的字符串,例如“$ BASH_SOURCE”,你会得到第一个元素,它是当前正在执行的函数或脚本的路径名。

+0

哇......我真的不想去兔子洞那么远,但那是一个很好的答案。我将坚持使用我的'readlink'解决方案,因为它足够用于我正在做的事情,但我会接受这个答案。 – Dan

+0

这将是一个更好的答案与条目摘要。 – DJClayworth

4

为什么在我问这个问题之前我不想试试这个?

THIS_SCRIPT=$(/usr/bin/readlink -nf "$0") 

工程很好。

5

我一直在做:

SCRIPT_PATH=$(cd `dirname ${0}`; pwd) 

我以前从未使用过的readlink:不仅是牛羚? (即它可以在HP-UX,AIX和Solaris上使用,dirname和pwd将会...)

(编辑添加``,我忘了原始文章。 (编辑2将两条线放在一起,我看过以前编写的脚本时显然总是这样做,但没有正确记住。第一次调用获取路径,第二次调用消除相对路径) (编辑3固定错误,妨碍单行回答工作,回到单行!)

相关问题