$(cmd)
sostituisce il risultato di cmd
come stringa, mentre (cmd; cmd)
eseguire un elenco di comandi in un sottoprocesso.
Se vuoi mettere l'output di uno o più comandi in una variabile usa il modulo $( cmd ).
Tuttavia, se vuoi eseguire un certo numero di comandi e trattarli come una singola unità, usa la forma ().
Quest'ultimo è utile quando vuoi eseguire una serie di comandi in background:
(git pull; make clean; make all) &
Queste sono cose diverse.
$()
valuta un'espressione (eseguendo un comando) come `` (backtick)
> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
Sono diversi, ma c'è una relazione mnemonica tra loro.
(...)
è un comando che avvia una nuova subshell in cui vengono eseguiti i comandi della shell.
$(...)
è un'espressione che avvia una nuova subshell, la cui espansione è l'output standard prodotto dai comandi che esegue.
Questo è simile a un'altra coppia comando/espressione in bash
:((...))
è un'istruzione aritmetica, mentre $((...))
è un'espressione aritmetica.