'C ..' ' ..' '| ..' .. i dont get it
On Mon, May 15, 2023, 19:35 Chet Ramey <chet.ra...@case.edu> wrote: > The latest devel branch push has the initial implementation of `nofork' > command substitution. The excerpt from the info manual describing it is > appended. > > Please test it out, and find the places I missed. Thanks. > > Chet > > ========== > There is an alternate form of command substitution: > > ${C COMMAND; } > > which executes COMMAND in the current execution environment. This means > that side effects of COMMAND take effect immediately in the current > execution environment and persist in the current environment after the > command completes (e.g., the 'exit' builtin will exit the shell). > > The character C following the open brace must be a space, tab, > newline, '(', or '|', and the close brace must be in a position where a > reserved word may appear (i.e., preceded by a command terminator such as > semicolon). Bash allows the close brace to be joined to the remaining > characters in the word without being followed by a shell metacharacter > as a reserved word would usually require. > > This type of command substitution superficially resembles executing > an unnamed shell function: local variables are created as when a shell > function is executing, and the 'return' builtin forces COMMAND to > complete; however, the rest of the execution environment, including the > positional parameters, is shared with the caller. > > If the first character following the open brace is a '(', COMMAND is > executed in a subshell, and COMMAND must be terminated by a ')'. This > is similar to the '(' compound command (*note Command Grouping::). If > the first character is a '|', the construct expands to the value of the > 'REPLY' shell variable after COMMAND executes, without removing any > trailing newlines, and the standard output of COMMAND remains the same > as in the calling shell. Bash creates 'REPLY' as an initially-unset > local variable when COMMAND executes, and restores 'REPLY' to the value > it had before the command substitution after COMMAND completes, as with > any local variable. > > For example, this construct expands to '12345', and leaves the shell > variable 'X' unchanged in the current execution environment: > > ${ local X=12345 ; echo $X; } > > (not declaring 'X' as local would modify its value in the current > environment, as with normal shell function execution), while this > construct does not require any output to expand to '12345': > > ${| REPLY=12345; } > > and restores 'REPLY' to the value it had before the command > substitution. > > -- > ``The lyf so short, the craft so long to lerne.'' - Chaucer > ``Ars longa, vita brevis'' - Hippocrates > Chet Ramey, UTech, CWRU c...@case.edu http://tiswww.cwru.edu/~chet/ > >