$(cmd)
remplace le résultat de cmd
sous forme de chaîne, alors que (cmd; cmd)
exécuter une liste de commandes dans un sous-processus.
Si vous souhaitez mettre la sortie d'une ou plusieurs commandes dans une variable, utilisez le formulaire $( cmd ).
Toutefois, si vous souhaitez exécuter plusieurs commandes et les traiter comme une seule unité, utilisez le formulaire ().
Ce dernier est utile lorsque vous souhaitez exécuter un ensemble de commandes en arrière-plan :
(git pull; make clean; make all) &
Ce sont des choses différentes.
$()
évalue une expression (exécution d'une commande) comme `` (backticks)
> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
Ils sont différents, mais il existe une relation mnémotechnique entre eux.
(...)
est une commande qui démarre un nouveau sous-shell dans lequel les commandes shell sont exécutées.
$(...)
est une expression qui démarre un nouveau sous-shell, dont l'expansion est la sortie standard produite par les commandes qu'il exécute.
Ceci est similaire à une autre paire commande/expression dans bash
:((...))
est une instruction arithmétique, tandis que $((...))
est une expression arithmétique.