sh(1): Describe subshell environment, command substitution better
authorPeter Avalos <pavalos@dragonflybsd.org>
Sat, 16 Apr 2011 21:21:02 +0000 (11:21 -1000)
committerPeter Avalos <pavalos@dragonflybsd.org>
Sat, 16 Apr 2011 21:55:47 +0000 (11:55 -1000)
POSIX does not require the shell to fork for a subshell environment, and
we use that possibility in various ways (command substitutions with a
single command and most subshells that are the final command of a shell
process).  Therefore do not tie subshells to forking in the man page.

Also, fix some sentences with excessive semicolons.

Obtained-from:  FreeBSD

bin/sh/sh.1

index e8a714a..7262ab9 100644 (file)
@@ -34,9 +34,9 @@
 .\" SUCH DAMAGE.
 .\"
 .\"    from: @(#)sh.1  8.6 (Berkeley) 5/4/95
-.\" $FreeBSD: src/bin/sh/sh.1,v 1.158 2011/02/08 23:19:40 jilles Exp $
+.\" $FreeBSD: src/bin/sh/sh.1,v 1.160 2011/03/20 23:52:45 jilles Exp $
 .\"
-.Dd February 8, 2011
+.Dd March 20, 2011
 .Dt SH 1
 .Os
 .Sh NAME
@@ -945,9 +945,9 @@ or
 .Pp
 .D1 Li { Ar list Ns Li \&; }
 .Pp
-The first form executes the commands in a subshell.
+The first form executes the commands in a subshell environment.
 Note that built-in commands thus executed do not affect the current shell.
-The second form does not fork another shell,
+The second form never forks another shell,
 so it is slightly more efficient.
 Grouping commands together this way allows the user to
 redirect their output as though they were one program:
@@ -1461,8 +1461,8 @@ or the backquoted version:
 .Pp
 .D1 Li ` Ns Ar command Ns Li `
 .Pp
-The shell expands the command substitution by executing command in a
-subshell environment and replacing the command substitution
+The shell expands the command substitution by executing command
+and replacing the command substitution
 with the standard output of the command,
 removing sequences of one or more newlines at the end of the substitution.
 Embedded newlines before the end of the output are not removed;
@@ -1470,6 +1470,18 @@ however, during field splitting, they may be translated into spaces
 depending on the value of
 .Va IFS
 and the quoting that is in effect.
+The command is executed in a subshell environment,
+except that the built-in commands
+.Ic jobid ,
+.Ic jobs ,
+.Ic times
+and
+.Ic trap
+return information about the main shell environment
+if they are the only command in a command substitution
+and the substitutions in the command cannot cause side effects
+(such as from assigning values to variables or referencing
+.Li $! ).
 .Ss Arithmetic Expansion
 Arithmetic expansion provides a mechanism for evaluating an arithmetic
 expression and substituting its value.
@@ -1852,13 +1864,13 @@ Terminate the shell process.
 If
 .Ar exitstatus
 is given
-it is used as the exit status of the shell;
-otherwise, if the shell is executing an
+it is used as the exit status of the shell.
+Otherwise, if the shell is executing an
 .Cm EXIT
 trap, the exit status of the last command before the trap is used;
 if the shell is executing a trap for a signal,
-the shell exits by resending the signal to itself;
-otherwise, the exit status of the preceding command is used.
+the shell exits by resending the signal to itself.
+Otherwise, the exit status of the preceding command is used.
 The exit status should be an integer between 0 and 255.
 .It Ic export Ar name ...
 .It Ic export Op Fl p
@@ -2280,8 +2292,8 @@ Omitting the
 .Ar action
 is another way to request the default action, for compatibility reasons this
 usage is not recommended though.
-When the shell forks off a subshell,
-it resets trapped (but not ignored) signals to the default action.
+In a subshell environment,
+the shell resets trapped (but not ignored) signals to the default action.
 The
 .Ic trap
 command has no effect on signals that were ignored on entry to the shell.