当我们在美元符号和括号内放入命令时,它在shell中是什么意思:$(command)


110

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

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

在不同版本的Shell中,也可以从以下代码行获得相同的输出

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

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

有人可以帮我弄清楚如何执行此命令吗?


1
这里是关于$()vs.的优缺点的问题``stackoverflow.com/questions/9449778/…–

Answers:


115

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


37
是; $(...)比起尝试使用反引号,写命令是一种更好的方法。考虑编写:gcclib=$(dirname $(dirname $(which gcc)))/lib使用反引号。甚至在进入Markdown的困难之中之前,它都变得更加困难,因为您必须转义嵌套命令的反引号,而不必使用$(...)符号。
Jonathan Leffler

7
从技术上讲,$(echo foo)创建命令替换而不是子shell。当前的另一个答案是正确的。我认为命令替换是在子外壳中运行的,但是它们仍然是不同的概念。
trysis

4
@trysis-命令替换肯定在subshel​​l中运行,因此值得注意。
Eliran Malka'1

2
我知道反引号产生的结果与$()相同,但是区别仅仅是修饰性的吗?除了$()更清晰之外,是否有理由使用一个相对另一个?
米切尔·特雷西

2
“像$(echo foo)这样的$的用法意味着运行子shell括号内的内容并将其作为值返回。” ...这很令人困惑,因为此命令$(echo foo)将尝试运行括号中返回的内容,它将首先运行,echo foo然后将尝试运行foo,这会产生错误
会计م19年

21
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 )"将获取包含正在调用的脚本的绝对目录。

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


1
对不起,晚了3年,但是您能否解释一下该声明为什么起作用?您说的是dirname返回执行文件的路径(相对于当前工作目录的绝对路径或绝对路径),cd将pwd更改为该目录,并pwd输出当前工作目录的绝对路径。但是为什么他们加入了&&?并将什么DIR持有,如果cd失败了呢?
基督徒

2
@Christian,如果失败将&&阻止其pwd运行cd,从而DIR将其为空而不是具有错误的目录。
查尔斯·达菲
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.