$(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.