在Bash中,$()和()有什么区别?

21

当我输入ls -l $(echo file)时,括号中的输出(仅为简单的echo)将被传递给外部的ls -l命令。它相当于简单的ls -l file

当我输入ls -l (echo file)时,会出现错误,因为不能在外部命令中嵌套使用()

有人可以帮助我理解$()()之间的区别吗?


5
其中一个是语法错误,而另一个则不是。它们几乎没有任何共同点。 - Keith Thompson
1
你期望 ls -l (echo file) 做什么? - John1024
4个回答

31

$(cmd)cmd 命令的结果以字符串形式替换,而 (cmd; cmd) 则在子进程中运行一系列命令。

如果您想将一个或多个命令的输出放入变量中,请使用 $(cmd) 格式。

然而,如果您想运行多个命令并将它们视为单个单位,则使用 () 格式。

当您想要在后台运行一组命令时,后者很有用:

(git pull; make clean; make all) &

抱歉,但我仍然不明白... </br> variable=$(ls; ps) </br> echo $variable 一切都正确,但是 </br> variable=(ls; ps) 会出现语法错误 </br> (ls; ps) 执行两个命令 </br> variable=(ls ps); echo $variable 只会输出字面上的 "ls" - run4gnu

9
它们是不同的,但它们之间存在一个助记关系。 (...) 是一个命令,它启动一个新的子Shell,在其中运行Shell命令。 $(...) 是一个表达式,它启动一个新的子Shell,其扩展是所运行命令产生的标准输出。
这类似于 bash 中的另一组命令/表达式对: ((...)) 是一个算术语句,而 $((...)) 是一个算术表达式。

9
那些是不同的东西。$()评估表达式(执行命令)就像``(反引号)一样。
> (echo ls)
ls

> $(echo ls)
file1  file2

> `echo ls`
file1  file2

> echo $(echo ls)
ls

1
应该是 echo $(echo ls),对吗? - Barmar

0

() 在 Bash 中也用于创建数组。请参阅 man bash

使用形式为 name=(value1 ... valuen) 的复合赋值来分配数组,其中每个值的形式为 [subscript]=string。

$ arr=(a b c 'd f' e)
$ declare -p arr 
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d f" [4]="e")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接