Is $() a subshell?
Clash Royale CLAN TAG#URR8PPP
up vote
43
down vote
favorite
I understand the subshell syntax to be (<commands...>)
, is $()
just a subshell that you can retrieve variable values from?
Note: This applies to bash 4.4 based on different wording in their documentation.
bash subshell syntax
add a comment |Â
up vote
43
down vote
favorite
I understand the subshell syntax to be (<commands...>)
, is $()
just a subshell that you can retrieve variable values from?
Note: This applies to bash 4.4 based on different wording in their documentation.
bash subshell syntax
4
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38
add a comment |Â
up vote
43
down vote
favorite
up vote
43
down vote
favorite
I understand the subshell syntax to be (<commands...>)
, is $()
just a subshell that you can retrieve variable values from?
Note: This applies to bash 4.4 based on different wording in their documentation.
bash subshell syntax
I understand the subshell syntax to be (<commands...>)
, is $()
just a subshell that you can retrieve variable values from?
Note: This applies to bash 4.4 based on different wording in their documentation.
bash subshell syntax
edited May 9 at 14:38
asked May 9 at 6:31
leeand00
1,27722036
1,27722036
4
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38
add a comment |Â
4
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38
4
4
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38
add a comment |Â
3 Answers
3
active
oldest
votes
up vote
62
down vote
accepted
$(â¦)
is a subshell by definition: it's a copy of the shell runtime stateù, and changes to the state made in the subshell have no impact on the parent. A subshell is typically implemented by forking a new process (but some shells may optimize this in some cases).
It isn't a subshell that you can retrieve variable values from. If changes to variables had an impact on the parent, it wouldn't be a subshell. It's a subshell whose output the parent can retrieve. The subshell created by $(â¦)
has its standard output set to a pipe, and the parent reads from that pipe and collects the output.
There are several other constructs that create a subshell. I think this is the full list for bash:
- Subshell for grouping:
( ⦠)
does nothing but create a subshell and wait for it to terminate). Contrast withâ¦ÃÂ
which groups commands purely for syntactic purposes and does not create a subshell.
Background:⦠&
creates a subshell and does not wait for it to terminate.
Pipeline:⦠| â¦
creates two subshells, one for the left-hand side and one for the right-hand side, and waits for both to terminate. The shell creates a pipe and connects the left-hand side's standard output to the write end of the pipe and the right-hand side's standard input to the read end. In some shells (ksh88, ksh93, zsh, bash with thelastpipe
option set and effective), the right-hand side runs in the original shell, so the pipeline construct only creates one subshell.
Command substitution:$(â¦)
(also spelled`â¦`
) creates a subshell with its standard output set to a pipe, collects the output in the parent and expands to that output, minus its trailing newlines. (And the output may be further subject to splitting and globbing, but that's another story.)
Process substitution:<(â¦)
creates a subshell with its standard output set to a pipe and expands to the name of the pipe. The parent (or some other process) may open the pipe to communicate with the subshell.>(â¦)
does the same but with the pipe on standard input.
Coprocess:coproc â¦
creates a subshell and does not wait for it to terminate. The subshell's standard input and output are each set to a pipe with the parent being connected to the other end of each pipe.
ù As opposed to running a separate shell.
Could you also include$...
in the answer?
â user1717828
May 9 at 19:29
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
add a comment |Â
up vote
20
down vote
From the bash(1) man page in bash version 4.4, "EXPANSION" section, "Command Substitution" subsection:
Bash performs the expansion by executing
command
in a subshell environment [...]
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
Interestingly, under CentOS 7 thebash
manpage doesn't mention any subshell:Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.
â dr01
May 9 at 6:55
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
add a comment |Â
up vote
5
down vote
Yes, ( commands... )
is a bash
subshell that will execute commands...
in another process.
The only difference when you have $( commands... )
is that this part of code will after execution of commands...
be replaced with everything that commands...
wrote to stdout
.
add a comment |Â
3 Answers
3
active
oldest
votes
3 Answers
3
active
oldest
votes
active
oldest
votes
active
oldest
votes
up vote
62
down vote
accepted
$(â¦)
is a subshell by definition: it's a copy of the shell runtime stateù, and changes to the state made in the subshell have no impact on the parent. A subshell is typically implemented by forking a new process (but some shells may optimize this in some cases).
It isn't a subshell that you can retrieve variable values from. If changes to variables had an impact on the parent, it wouldn't be a subshell. It's a subshell whose output the parent can retrieve. The subshell created by $(â¦)
has its standard output set to a pipe, and the parent reads from that pipe and collects the output.
There are several other constructs that create a subshell. I think this is the full list for bash:
- Subshell for grouping:
( ⦠)
does nothing but create a subshell and wait for it to terminate). Contrast withâ¦ÃÂ
which groups commands purely for syntactic purposes and does not create a subshell.
Background:⦠&
creates a subshell and does not wait for it to terminate.
Pipeline:⦠| â¦
creates two subshells, one for the left-hand side and one for the right-hand side, and waits for both to terminate. The shell creates a pipe and connects the left-hand side's standard output to the write end of the pipe and the right-hand side's standard input to the read end. In some shells (ksh88, ksh93, zsh, bash with thelastpipe
option set and effective), the right-hand side runs in the original shell, so the pipeline construct only creates one subshell.
Command substitution:$(â¦)
(also spelled`â¦`
) creates a subshell with its standard output set to a pipe, collects the output in the parent and expands to that output, minus its trailing newlines. (And the output may be further subject to splitting and globbing, but that's another story.)
Process substitution:<(â¦)
creates a subshell with its standard output set to a pipe and expands to the name of the pipe. The parent (or some other process) may open the pipe to communicate with the subshell.>(â¦)
does the same but with the pipe on standard input.
Coprocess:coproc â¦
creates a subshell and does not wait for it to terminate. The subshell's standard input and output are each set to a pipe with the parent being connected to the other end of each pipe.
ù As opposed to running a separate shell.
Could you also include$...
in the answer?
â user1717828
May 9 at 19:29
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
add a comment |Â
up vote
62
down vote
accepted
$(â¦)
is a subshell by definition: it's a copy of the shell runtime stateù, and changes to the state made in the subshell have no impact on the parent. A subshell is typically implemented by forking a new process (but some shells may optimize this in some cases).
It isn't a subshell that you can retrieve variable values from. If changes to variables had an impact on the parent, it wouldn't be a subshell. It's a subshell whose output the parent can retrieve. The subshell created by $(â¦)
has its standard output set to a pipe, and the parent reads from that pipe and collects the output.
There are several other constructs that create a subshell. I think this is the full list for bash:
- Subshell for grouping:
( ⦠)
does nothing but create a subshell and wait for it to terminate). Contrast withâ¦ÃÂ
which groups commands purely for syntactic purposes and does not create a subshell.
Background:⦠&
creates a subshell and does not wait for it to terminate.
Pipeline:⦠| â¦
creates two subshells, one for the left-hand side and one for the right-hand side, and waits for both to terminate. The shell creates a pipe and connects the left-hand side's standard output to the write end of the pipe and the right-hand side's standard input to the read end. In some shells (ksh88, ksh93, zsh, bash with thelastpipe
option set and effective), the right-hand side runs in the original shell, so the pipeline construct only creates one subshell.
Command substitution:$(â¦)
(also spelled`â¦`
) creates a subshell with its standard output set to a pipe, collects the output in the parent and expands to that output, minus its trailing newlines. (And the output may be further subject to splitting and globbing, but that's another story.)
Process substitution:<(â¦)
creates a subshell with its standard output set to a pipe and expands to the name of the pipe. The parent (or some other process) may open the pipe to communicate with the subshell.>(â¦)
does the same but with the pipe on standard input.
Coprocess:coproc â¦
creates a subshell and does not wait for it to terminate. The subshell's standard input and output are each set to a pipe with the parent being connected to the other end of each pipe.
ù As opposed to running a separate shell.
Could you also include$...
in the answer?
â user1717828
May 9 at 19:29
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
add a comment |Â
up vote
62
down vote
accepted
up vote
62
down vote
accepted
$(â¦)
is a subshell by definition: it's a copy of the shell runtime stateù, and changes to the state made in the subshell have no impact on the parent. A subshell is typically implemented by forking a new process (but some shells may optimize this in some cases).
It isn't a subshell that you can retrieve variable values from. If changes to variables had an impact on the parent, it wouldn't be a subshell. It's a subshell whose output the parent can retrieve. The subshell created by $(â¦)
has its standard output set to a pipe, and the parent reads from that pipe and collects the output.
There are several other constructs that create a subshell. I think this is the full list for bash:
- Subshell for grouping:
( ⦠)
does nothing but create a subshell and wait for it to terminate). Contrast withâ¦ÃÂ
which groups commands purely for syntactic purposes and does not create a subshell.
Background:⦠&
creates a subshell and does not wait for it to terminate.
Pipeline:⦠| â¦
creates two subshells, one for the left-hand side and one for the right-hand side, and waits for both to terminate. The shell creates a pipe and connects the left-hand side's standard output to the write end of the pipe and the right-hand side's standard input to the read end. In some shells (ksh88, ksh93, zsh, bash with thelastpipe
option set and effective), the right-hand side runs in the original shell, so the pipeline construct only creates one subshell.
Command substitution:$(â¦)
(also spelled`â¦`
) creates a subshell with its standard output set to a pipe, collects the output in the parent and expands to that output, minus its trailing newlines. (And the output may be further subject to splitting and globbing, but that's another story.)
Process substitution:<(â¦)
creates a subshell with its standard output set to a pipe and expands to the name of the pipe. The parent (or some other process) may open the pipe to communicate with the subshell.>(â¦)
does the same but with the pipe on standard input.
Coprocess:coproc â¦
creates a subshell and does not wait for it to terminate. The subshell's standard input and output are each set to a pipe with the parent being connected to the other end of each pipe.
ù As opposed to running a separate shell.
$(â¦)
is a subshell by definition: it's a copy of the shell runtime stateù, and changes to the state made in the subshell have no impact on the parent. A subshell is typically implemented by forking a new process (but some shells may optimize this in some cases).
It isn't a subshell that you can retrieve variable values from. If changes to variables had an impact on the parent, it wouldn't be a subshell. It's a subshell whose output the parent can retrieve. The subshell created by $(â¦)
has its standard output set to a pipe, and the parent reads from that pipe and collects the output.
There are several other constructs that create a subshell. I think this is the full list for bash:
- Subshell for grouping:
( ⦠)
does nothing but create a subshell and wait for it to terminate). Contrast withâ¦ÃÂ
which groups commands purely for syntactic purposes and does not create a subshell.
Background:⦠&
creates a subshell and does not wait for it to terminate.
Pipeline:⦠| â¦
creates two subshells, one for the left-hand side and one for the right-hand side, and waits for both to terminate. The shell creates a pipe and connects the left-hand side's standard output to the write end of the pipe and the right-hand side's standard input to the read end. In some shells (ksh88, ksh93, zsh, bash with thelastpipe
option set and effective), the right-hand side runs in the original shell, so the pipeline construct only creates one subshell.
Command substitution:$(â¦)
(also spelled`â¦`
) creates a subshell with its standard output set to a pipe, collects the output in the parent and expands to that output, minus its trailing newlines. (And the output may be further subject to splitting and globbing, but that's another story.)
Process substitution:<(â¦)
creates a subshell with its standard output set to a pipe and expands to the name of the pipe. The parent (or some other process) may open the pipe to communicate with the subshell.>(â¦)
does the same but with the pipe on standard input.
Coprocess:coproc â¦
creates a subshell and does not wait for it to terminate. The subshell's standard input and output are each set to a pipe with the parent being connected to the other end of each pipe.
ù As opposed to running a separate shell.
edited May 9 at 19:19
answered May 9 at 8:30
Gilles
503k1189951522
503k1189951522
Could you also include$...
in the answer?
â user1717828
May 9 at 19:29
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
add a comment |Â
Could you also include$...
in the answer?
â user1717828
May 9 at 19:29
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
Could you also include
$...
in the answer?â user1717828
May 9 at 19:29
Could you also include
$...
in the answer?â user1717828
May 9 at 19:29
2
2
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
@user1717828 What? Why? What does variable expansion remotely have to do with this question? I'm not going to include the whole shell manual in my answer.
â Gilles
May 9 at 19:31
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
What does variable expansion remotely have to do with this question? I don't know, that's why I asked :-) So I'm guessing the curly brace substitution is nothing like the parenthesis brace substitution.
â user1717828
May 9 at 19:43
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
@user1717828: variable expansion is unrelated to subshells; it's a separate mechanism altogether, and definitely worth reading into if you're just starting out!
â Jules
May 10 at 16:47
add a comment |Â
up vote
20
down vote
From the bash(1) man page in bash version 4.4, "EXPANSION" section, "Command Substitution" subsection:
Bash performs the expansion by executing
command
in a subshell environment [...]
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
Interestingly, under CentOS 7 thebash
manpage doesn't mention any subshell:Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.
â dr01
May 9 at 6:55
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
add a comment |Â
up vote
20
down vote
From the bash(1) man page in bash version 4.4, "EXPANSION" section, "Command Substitution" subsection:
Bash performs the expansion by executing
command
in a subshell environment [...]
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
Interestingly, under CentOS 7 thebash
manpage doesn't mention any subshell:Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.
â dr01
May 9 at 6:55
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
add a comment |Â
up vote
20
down vote
up vote
20
down vote
From the bash(1) man page in bash version 4.4, "EXPANSION" section, "Command Substitution" subsection:
Bash performs the expansion by executing
command
in a subshell environment [...]
From the bash(1) man page in bash version 4.4, "EXPANSION" section, "Command Substitution" subsection:
Bash performs the expansion by executing
command
in a subshell environment [...]
edited May 9 at 8:16
Gilles
503k1189951522
503k1189951522
answered May 9 at 6:33
Ignacio Vazquez-Abrams
32k66780
32k66780
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
Interestingly, under CentOS 7 thebash
manpage doesn't mention any subshell:Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.
â dr01
May 9 at 6:55
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
add a comment |Â
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
Interestingly, under CentOS 7 thebash
manpage doesn't mention any subshell:Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.
â dr01
May 9 at 6:55
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
9
9
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
This is also explicitly specified by POSIX.
â Stephen Kitt
May 9 at 6:36
1
1
Interestingly, under CentOS 7 the
bash
manpage doesn't mention any subshell: Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.â dr01
May 9 at 6:55
Interestingly, under CentOS 7 the
bash
manpage doesn't mention any subshell: Bash performs the expansion by executing command and replacing the command substitution with the standard output of the command, with any trailing newlines deleted.
I wonder if this was a deliberate omission.â dr01
May 9 at 6:55
6
6
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
@dr01 On the contrary, bash 4.4 changed the wording of that sentence to include the word âÂÂsubshellâÂÂ. It was a clarification: the manual explicitly mentioned that various other constructs were subshells, but until 4.4 it wasn't explicitly stated for command substitution.
â Gilles
May 9 at 8:17
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
Yep, on CentOS v7.4.1708 (fairly recent) bash is v4.2.46.
â dr01
May 9 at 12:42
add a comment |Â
up vote
5
down vote
Yes, ( commands... )
is a bash
subshell that will execute commands...
in another process.
The only difference when you have $( commands... )
is that this part of code will after execution of commands...
be replaced with everything that commands...
wrote to stdout
.
add a comment |Â
up vote
5
down vote
Yes, ( commands... )
is a bash
subshell that will execute commands...
in another process.
The only difference when you have $( commands... )
is that this part of code will after execution of commands...
be replaced with everything that commands...
wrote to stdout
.
add a comment |Â
up vote
5
down vote
up vote
5
down vote
Yes, ( commands... )
is a bash
subshell that will execute commands...
in another process.
The only difference when you have $( commands... )
is that this part of code will after execution of commands...
be replaced with everything that commands...
wrote to stdout
.
Yes, ( commands... )
is a bash
subshell that will execute commands...
in another process.
The only difference when you have $( commands... )
is that this part of code will after execution of commands...
be replaced with everything that commands...
wrote to stdout
.
answered May 9 at 8:39
Iskustvo
667118
667118
add a comment |Â
add a comment |Â
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
StackExchange.ready(
function ()
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2funix.stackexchange.com%2fquestions%2f442692%2fis-a-subshell%23new-answer', 'question_page');
);
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Sign up or log in
StackExchange.ready(function ()
StackExchange.helpers.onClickDraftSave('#login-link');
);
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
4
Possible duplicate of What is command substitution in a shell?
â Julien Lopez
May 9 at 12:38