139

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

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

同样的输出也可以在不同版本的shell中从以下代码行中获取

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

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

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

4

2 回答 2

136

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

于 2013-08-01T03:53:17.893 回答
24
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 )"获取包含被调用脚本的绝对目录。

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

于 2013-08-01T05:09:18.733 回答