在 shell 中,当我们将一个命令放在美元符号和括号中时,这意味着什么: $(command)

我只是想了解下面这行 shell 代码。它用于获取当前的工作目录。我知道 $(variable) name 返回变量 name 中的值,但是 $(command)应该返回什么?它在执行命令后返回值吗?在这种情况下,我们可以使用 `来执行命令。

CWD="$(cd "$(dirname $0)"; pwd)"

下面这行代码也可以在不同版本的 shell 中获得相同的输出

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

我不能理解 $(cd..$(dirname的意思。

有人能帮我弄清楚这个命令是如何执行的吗?

78342 次浏览

使用像 ${HOME}这样的 $可以得到 HOME 的价值。像 $(echo foo)这样使用 $意味着运行子 shell 中括号内的任何内容,并将其作为值返回。在我的示例中,您将得到 foo,因为 echo将把 foo写成标准输出

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

有人能帮我弄清楚这个命令是如何执行的吗?

让我们看看命令的不同部分。BASH_SOURCE是一个 bash 数组变量,包含源文件名。因此 "${BASH_SOURCE[0]}"将返回脚本文件的名称。

dirname是 GNU coreutils 提供的一个实用程序,它将 最后一部分从文件名中删除。因此,如果通过说 bash foo来执行脚本,"$( dirname "${BASH_SOURCE[0]}" )"将返回 .。如果你说 bash ../foo,它将返回 ..; 对于 bash /some/path/foo,它将返回 /some/path

最后,整个命令 "$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"获取包含正在调用的脚本的绝对目录。

$(...)允许指令替代,即允许命令的输出替换命令本身,并且可以嵌套。