run4gnu
run4gnu

Reputation: 343

Difference between $() and () in Bash

When I type ls -l $(echo file) output from bracket (which is just simple echo'ing) is taken and passed to external ls -l command. It equals to simple ls -l file.

When I type ls -l (echo file) we have error because one cannot nest () inside external command.

Can someone help me understand the difference between $() and () ?

Upvotes: 22

Views: 17347

Answers (4)

Kai
Kai

Reputation: 524

() is also used to create array in bash. See man bash:

Arrays are assigned to using compound assignments of the form name=(value1 ... valuen), where each value is of the form [subscript]=string.

$ arr=(a b c 'd f' e)
$ declare -p arr 
declare -a arr=([0]="a" [1]="b" [2]="c" [3]="d f" [4]="e")

Upvotes: 1

Barry Scott
Barry Scott

Reputation: 819

$(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) &

Upvotes: 31

chenchuk
chenchuk

Reputation: 5742

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

Upvotes: 9

chepner
chepner

Reputation: 532313

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.

Upvotes: 10

Related Questions