Bash中$()和()之间的区别

run*_*gnu 11 unix linux bash subshell

当我ls -l $(echo file)从括号输入输出(这只是简单的回声)时,将其传递给外部ls -l命令.它等于简单ls -l file.

当我键入时,ls -l (echo file)我们有错误,因为无法嵌套()在外部命令中.

有人可以帮助我理解之间的差异$()()

Bar*_*ott 19

$(cmd) 将结果替换cmd为字符串,而(cmd; cmd)在子进程中运行命令列表.

如果要将一个或多个命令的输出放入变量,请使用$(cmd)表单.

但是,如果要运行许多命令并将它们视为一个单元,请使用()表单.

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

(git pull; make clean; make all) &
Run Code Online (Sandbox Code Playgroud)


che*_*huk 5

那是不同的东西。

$() 计算一个表达式(执行命令),例如“(反引号)

> (echo ls)
ls

> $(echo ls)
file1  file2

> `echo ls`
file1  file2

> echo $(echo ls)
ls
Run Code Online (Sandbox Code Playgroud)


che*_*ner 5

它们是不同的,但是它们之间存在助记符关系。

(...) 是一个命令,该命令启动一个新的子shell,在其中运行shell命令。

$(...) 是一个表达式,它将启动一个新的子shell,该子shell的扩展是由其运行的命令产生的标准输出。

这类似于:中的另一个命令/表达式对bash((...))是一个算术语句,$((...))而是一个算术表达式。