在bash中有两种方法来捕获命令行的输出:

Legacy Bourne shell反引号' ': var =“命令” $()语法(据我所知是Bash特定的,或者至少不支持非posix旧shell,如原始Bourne) var = $(命令)

与反撇号相比,使用第二种语法有什么好处吗?还是两者完全相同?


当前回答

$()允许嵌套。

out=$(echo today is $(date))

我觉得倒勾是不允许的。

其他回答

最主要的一个是嵌套它们的能力,命令中的命令,而不会失去理智,试图弄清楚某种形式的转义是否对反节拍有效。

一个例子,虽然有点做作:

deps=$(find /dir -name $(ls -1tr 201112[0-9][0-9]*.txt | tail -1l) -print)

它会给你一个/dir目录树中所有与2011年12月以来最早的文本文件同名的文件的列表(a)。

另一个例子是获取父目录的名称(而不是完整路径):

pax> cd /home/pax/xyzzy/plugh
pax> parent=$(basename $(dirname $PWD))
pax> echo $parent
xyzzy

(a)既然那个特定的命令可能实际上不起作用,我还没有测试它的功能。所以,如果你投我的反对票,你已经失去了意图:-)这只是一个说明你如何嵌套,而不是作为一个没有bug的生产准备片段。

我想出了一个完全有效的$(…)除以'…'的例子。

我正在使用一个运行Cygwin的Windows远程桌面,并希望迭代一个命令的结果。遗憾的是,由于远程桌面或Cygwin本身的原因,反勾字符无法输入。

合理的假设是,在这种奇怪的设置中,美元符号和圆括号会更容易输入。

来自man bash:

       $(command)
or
       `command`

Bash performs the expansion by executing command and replacing the com-
mand  substitution  with  the  standard output of the command, with any
trailing newlines deleted.  Embedded newlines are not deleted, but they
may  be  removed during word splitting.  The command substitution $(cat
file) can be replaced by the equivalent but faster $(< file).

When the old-style backquote form of substitution  is  used,  backslash
retains  its  literal  meaning except when followed by $, `, or \.  The
first backquote not preceded by a backslash terminates the command sub-
stitution.   When using the $(command) form, all characters between the
parentheses make up the command; none are treated specially.

$()允许嵌套。

out=$(echo today is $(date))

我觉得倒勾是不允许的。

除了其他答案,

$(...)

在视觉上更突出

`...`

反撇号看起来太像撇号了;这取决于你使用的字体。

(而且,正如我刚刚注意到的,在内联代码示例中输入反撇号要困难得多。)