DIR= "$( cd " $( 目录名称 "${BASH_SOURCE[0]}" ) " && pwd )" 这是如何工作的?



我需要得到脚本的路径。如果我已经在同一个目录中,我可以使用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:这只工作,当你总是启动你的脚本从它的当前文件夹。

最新更新