$(cmd) ersetzt das Ergebnis von cmd als String, wohingegen (cmd; cmd) Führen Sie eine Liste von Befehlen in einem Unterprozess aus.
Wenn Sie die Ausgabe eines oder mehrerer Befehle in eine Variable schreiben möchten, verwenden Sie die Form $( cmd ).
Wenn Sie jedoch mehrere Befehle ausführen und sie als eine einzige Einheit behandeln möchten, verwenden Sie das ()-Formular.
Letzteres ist nützlich, wenn Sie eine Reihe von Befehlen im Hintergrund ausführen möchten:
(git pull; make clean; make all) &
Das sind verschiedene Dinge.
$() wertet einen Ausdruck (Ausführen eines Befehls) wie `` (Backticks)
> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
Sie sind unterschiedlich, aber es gibt eine mnemotechnische Beziehung zwischen ihnen.
(...) ist ein Befehl, der eine neue Subshell startet, in der Shell-Befehle ausgeführt werden.
$(...) ist ein Ausdruck, der eine neue Subshell startet, deren Erweiterung die Standardausgabe ist, die von den ausgeführten Befehlen erzeugt wird.
Dies ähnelt einem anderen Befehl/Ausdruck-Paar in bash :((...)) ist eine arithmetische Anweisung, während $((...)) ist ein arithmetischer Ausdruck.