这样做的蛮力方式是否较少?
#!/bin/ksh
THIS_SCRIPT=$(/usr/bin/readlink -f $(echo $0 | /bin/sed "s,^[^/],$PWD/&,"))
echo $THIS_SCRIPT
我坚持使用ksh
但更喜欢在bash
中运行的解决方案(我认为这样做)。
答案 0 :(得分:5)
如何确定脚本的位置?我想从同一个地方读取一些配置文件。
出现此问题有两个主要原因:要么想要外部化数据或配置脚本,要么需要一种方法来查找这些外部资源,或者您的脚本旨在对某种类型的捆绑进行操作(例如一个构建脚本),需要找到要处理的资源。
重要的是要意识到在一般情况下,这个问题没有解决方案。您可能听说过的任何方法以及下面将详述的任何方法都存在缺陷,并且仅适用于特定情况。首先,尽量不要依赖脚本的位置来避免问题!
...
使用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)