$(cmd)
sustituye el resultado de cmd
como una cadena, mientras que (cmd; cmd)
ejecutar una lista de comandos en un subproceso.
Si desea poner la salida de uno o más comandos en una variable, use el formulario $( cmd ).
Sin embargo, si desea ejecutar varios comandos y tratarlos como una sola unidad, utilice la forma ().
Este último es útil cuando desea ejecutar un conjunto de comandos en segundo plano:
(git pull; make clean; make all) &
Esas son cosas diferentes.
$()
evalúa una expresión (ejecutando un comando) como `` (comillas graves)
> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
Son diferentes, pero existe una relación mnemotécnica entre ellos.
(...)
es un comando que inicia un nuevo subshell en el que se ejecutan los comandos del shell.
$(...)
es una expresión que inicia una nueva subcapa, cuya expansión es la salida estándar producida por los comandos que ejecuta.
Esto es similar a otro par de comando/expresión en bash
:((...))
es una declaración aritmética, mientras que $((...))
es una expresión aritmética.