Difference between ${} and $() in Bash
$(cmd)
substitutes the result of cmd
as a string, whereas (cmd; cmd)
run a list of commands in a subprocess.
If you want to put the output of one or more commands into a variable use the $( cmd ) form.
However if you want to run a number of commands and treat them as a single unit use the () form.
The latter is useful when you want to run a set of commands in the background:
(git pull; make clean; make all) &
Those are different things.
$()
evaluates an expression (executing a command) like `` (backticks)
> (echo ls)
ls
> $(echo ls)
file1 file2
> `echo ls`
file1 file2
> echo $(echo ls)
ls
They are different, but there is a mnemonic relationship between them.
(...)
is a command that starts a new subshell in which shell commands are run.
$(...)
is an expression that starts a new subshell, whose expansion is the standard output produced by the commands it runs.
This is similar to another command/expression pair in bash
: ((...))
is an arithmetic statement, while $((...))
is an arithmetic expression.