( du /etc; du /var; ) > tmp.txt
{ du /etc; du /var; } > tmp.txt
Is there a difference between the () and {}?
The output of tmp.txt seems exactly the same, and I was wondering whether i'm missing something here.
( du /etc; du /var; ) > tmp.txt
{ du /etc; du /var; } > tmp.txt
Is there a difference between the () and {}?
The output of tmp.txt seems exactly the same, and I was wondering whether i'm missing something here.
Parentheses cause the commands to be run in a subshell.
Braces cause the commands to be grouped together but not in a subshell.
Given that your example does not use side-effects, there is no real difference between both. If there were side-effects, e.g. setting or modifying shell variables, there is a difference as such side-effects applied to a sub-shell will be forgotten when this sub-shell ends.
To understand the "side-effect", see the following examples:
Using parentheses ()
:
v="test";
( echo $v; v="modified"; echo $v; );
echo $v;
output:
test
modified
test
Using curly braces {}
:
v="test";
{ echo $v; v="modified"; echo $v; };
echo $v;
output:
test
modified
modified
If you however take a closer look and compare the behavior of different shell implementations, it becomes confusing:
The Bourne Shell e.g. runs grouped commands in a subshell in case there is an I/O redirection and ksh93 avoids subshells by implementing virtual subshell behavior that is done by creating a temporary copy of new parameters. Whether this is always 100% correct is not known, ksh93 Version M 1993-12-28 s+
from 2009 e.g. implements $(...) incorrectly and $(alias a=b) affects the main shell.
So in general: if you are interested in specific aspects, be careful and check your shell for it's actual behavior.
(a;b)
will not spawn more processes than {a;b;}
(if b
is not a builtin nor function nor compound command and there's no local trap) as b
will be executed in that child subshell process.
– Stéphane Chazelas
Mar 04 '16 at 17:20
And the output stays the same, regardless of the subshell (in this case).
Thankyou, this helped!
– Nelske Mar 04 '16 at 17:32
exit ;
between the du. – Archemar Mar 04 '16 at 17:10{ list; }
executes commands in current shell environment. – Mar 04 '16 at 18:31