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

时间:2013-08-01 03:49:36

标签: bash shell terminal sh ksh

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

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

在不同版本的shell

中也可以从以下代码行中获取相同的输出
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

我无法理解$(cd..$(dirname的含义。

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

2 个答案:

答案 0 :(得分:94)

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

答案 1 :(得分:17)

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

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

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

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

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

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