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

Bash 在shell中,当我们将命令放在美元符号和圆括号内时,它意味着什么:$(command),bash,shell,terminal,sh,ksh,Bash,Shell,Terminal,Sh,Ksh,我只想理解shell中的以下代码行。它用于获取当前工作目录。我知道$(变量)name返回变量名中的值,但是$(命令)应该返回什么?执行命令后是否返回值?在这种情况下,我们可以使用`来执行命令 CWD="$(cd "$(dirname $0)"; pwd)" 在不同版本的shell中,也可以从以下代码行获得相同的输出 DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" 我无法理解$(cd..和$(dirname的含义

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

CWD="$(cd "$(dirname $0)"; pwd)"
在不同版本的shell中,也可以从以下代码行获得相同的输出

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
我无法理解
$(cd..
$(dirname
的含义


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

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

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

让我们看看命令的不同部分。
BASH\u SOURCE
是一个包含源文件名的BASH数组变量。因此
“${BASH\u 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)
获取包含被调用脚本的绝对目录


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

是的;<代码> $(…)>代码>是编写命令而不是试图使用回引号的更好方法。请考虑编写:<代码> GCclib=$(DrimeNo.$(DrimeN$(GCC)))/lib使用反引号。即使在您遇到在Markdown中使用反引号的困难之前,它也会变得更加困难,因为您必须转义嵌套命令的反引号,而使用
$(…)
符号则不会。从技术上讲,
$(echo foo)
创建一个命令替换,而不是子shell。当前的另一个答案是正确的。我认为命令替换是在子shell中运行的,有点像,但它们仍然是不同的概念。@trysis-command substitution,因此值得注意。我知道反勾号产生的结果与$(),但区别纯粹是表面的吗?除了$()更清晰之外,还有理由使用其中一个吗?“$like$(echo foo)的用法意味着运行子shell中括号内的任何内容,并将其作为值返回。”…这令人困惑,因为此命令
$(echo foo)
将尝试运行从括号中返回的内容,它将首先运行
echo foo
,然后尝试运行
foo
,这会导致一个错误,很抱歉迟到了3年,但请您解释一下为什么该语句有效吗?您说的
dirname
返回执行文件的路径(相对于或绝对于当前工作目录),
cd
将pwd更改为该目录,并且
pwd
打印出当前工作目录的绝对路径。但是为什么它们由
&
连接?如果
cd
失败,
DIR
将保持什么?@Christian,
&
防止
pwd
cd
失败时运行例如,
DIR
将是空的,而不是有一个不正确的目录。下面是一个关于
$()
`
的优缺点的问题:
DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"