23

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 () ?

2
  • 5
    One is a syntax error; the other is not. They pretty much have nothing in common. Commented Aug 23, 2016 at 20:56
  • 1
    What did you expect ls -l (echo file) to do? Commented Aug 23, 2016 at 20:59

4 Answers 4

32

$(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) &
Sign up to request clarification or add additional context in comments.

1 Comment

sorry, but still i dont get it... </br> variable=$(ls; ps) </br> echo $variable and eveyrting is correct , but </br> variable=(ls; ps) gives syntax error </br> (ls; ps) executes both commands </br> variable=(ls ps); echo $variable gives "ls" literally
11

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.

Comments

9

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

1 Comment

Shouldn't it be echo $(echo ls)
1

() 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")

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.