我需要得到脚本的路径。如果我已经在同一个目录中,我可以使用pwd
,我在网上搜索,我发现了这个
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
但是我不知道怎么用
Bash维护了许多变量,包括BASH_SOURCE
,它是一个源文件路径名数组。
${}
作为变量的一种引用。
$()
作为命令的引号,但它们在自己的上下文中运行。
dirname
给出所提供参数的路径部分。
cd
更改当前目录。
pwd
给出当前路径。
&&
是逻辑上的and
,但在这个实例中使用它是因为它的副作用是一个接一个地运行命令。
cd
将其剥离为该路径,然后使用pwd
返回脚本的(有效的)完整路径。这被分配给DIR
。在所有这些之后,上下文被展开,因此您最终返回到开始的目录,但是使用包含脚本路径的环境变量DIR
。让我们来分析一下:
DIR ="(cd"美元(目录名"$ {BASH_SOURCE[0]}")";,,pwd)"
-
${BASH_SOURCE[0]}
:将解析为从命令行调用的脚本名称(您需要${}来干净地访问数组) -
"$( dirname "${BASH_SOURCE[0]}" )"
:将解析到它的dir部分-
dirname "/foo/bar"
give "/foo" -
"
(引号)处理的情况下,你有空格在它(无论是在文件名和路径) -
$(command)
将调用命令并在变量 中返回标准输出
-
第一部分有一些限制。如果通过链接调用脚本,您将收到链接的目录名,而不是脚本的目录名。这可以很好。但是,如果您想要获取另一个文件(假设是一个库),则该文件位于实际脚本的旁边。要找到真正的路径,您需要更多:
-
$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )
:将解析为脚本的真实路径。
如何使用?
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
. "$DIR"/lib.sh
不要做什么?
pwd
:这只工作,当你总是启动你的脚本从它的当前文件夹。