[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: nofork command substitution
From: |
Chet Ramey |
Subject: |
Re: nofork command substitution |
Date: |
Fri, 19 May 2023 10:29:14 -0400 |
User-agent: |
Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.11.0 |
On 5/18/23 10:14 PM, Dale R. Worley wrote:
Chet Ramey <chet.ramey@case.edu> writes:
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.
I had to read this a couple of times to figure out what it means. In
particular "the word" isn't well-bound here.
Command substitution is a word expansion; word expansions are performed on
words; command substitution occurs as part of a word. That all seems
self-evident. The only reason to mention it is the quirk required to have
the close brace act as a reserved word when it is needed to terminate the
command (you know someone will eventually ask about it).
This text is clear in its description of the behavior but entirely
unclear regarding what the point is:
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.
What's mysterious about it? If you don't want to have to output text as
the value of the command substitution, you can simply assign arbitrary
data to REPLY. The bonus is that the trailing newlines are preserved, a
common question about standard command substitution.
My guess is that the intention is for COMMAND to be "read" with no
names:
Not necessarily. The example shows a simple assignment to REPLY.
Also, can you clarify the semantics on this point: The text above says
"the construct expands to the value of the 'REPLY' shell variable after
COMMAND executes, without removing any trailing newlines". However, the
documentation of "read" says: "If no names are supplied, the line read,
without the ending delimiter but otherwise unmodified, is assigned to
the variable REPLY."
The two uses are unrelated.
So the sequence of processing is: read inputs a line; read deletes the
ending newline and assigns the remainder to REPLY; command substitution
obtains the value of REPLY (which does not contain a newline); command
substitution returns that value "without removing any trailing
newlines".
Is that what you intend the code to do/what the code does?
No. I mean, if you want to use `read' in that way, you certainly can, but
that's not going to be the common case.
Chet
--
``The lyf so short, the craft so long to lerne.'' - Chaucer
``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU chet@case.edu http://tiswww.cwru.edu/~chet/
- Re: nofork command substitution, (continued)
- Re: nofork command substitution, Greg Wooledge, 2023/05/19
- Re: nofork command substitution, alex xmb ratchev, 2023/05/19
- Re: nofork command substitution, Robert Elz, 2023/05/19
- Re: nofork command substitution, alex xmb ratchev, 2023/05/19
- Re: nofork command substitution, alex xmb ratchev, 2023/05/19
- Re: nofork command substitution, Chet Ramey, 2023/05/22
- Re: nofork command substitution, Martijn Dekker, 2023/05/22
Re: nofork command substitution,
Chet Ramey <=
Re: nofork command substitution, alex xmb ratchev, 2023/05/19
Re: nofork command substitution, Chet Ramey, 2023/05/19
Re: nofork command substitution, Grisha Levit, 2023/05/19