如何获取当前shell脚本的完整路径名?

时间:2010-03-17 19:15:11

标签: bash ksh pathname

这样做的蛮力方式是否较少?

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

我坚持使用ksh但更喜欢在bash中运行的解决方案(我认为这样做)。

4 个答案:

答案 0 :(得分:5)

bash FAQ中的

Entry #28

  

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

     

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

     

重要的是要意识到在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及下面将详述的任何方法都存在缺陷,并且仅适用于特定情况。首先,尽量不要依赖脚本的位置来避免问题!

     

...

     

使用BASH_SOURCE

     

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

答案 1 :(得分:5)

我一直都这样做:

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

我之前从未使用过readlink:它只是Gnu吗? (即它是否适用于HP-UX,AIX和Solaris开箱即用?dirname和pwd将......)

(编辑添加``我在原帖中忘了。我的!) (编辑2放两行,当我查看我之前编写的脚本时,我显然总是这样做,但是没有记得正确。第一次调用获取路径,第二次调用消除了相对路径) (编辑3个固定的拼写错误,阻止单行回答工作,回到单行!)

答案 2 :(得分:4)

在我提出问题之前,为什么我不想尝试这个?

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

效果很好。

答案 3 :(得分:0)

在macOS中,我使用(编辑:仅当您从脚本实际所在的位置运行脚本时才起作用!)

my_script=$(pwd)/$(basename $0)