[Toybox] Would someone please explain what bash is doing here?

Chet Ramey chet.ramey at case.edu
Mon May 18 08:41:41 PDT 2020


On 5/17/20 7:11 AM, Rob Landley wrote:
> I had a reply window open to this when my laptop battery died, and thunderbird
> doesn't store unfinished messages like kmail and vi and chrome...
> 
> Anyway, I was reminded of this thread by:
> 
>   $ IFS=x; ABC=cxd; for i in +($ABC); do echo =$i=; done
>   =+(c=
>   =d)=
>   $ bash -c 'IFS=x; ABC=cxd; for i in +($ABC); do echo =$i=; done'
>   bash: -c: line 0: syntax error near unexpected token `('
>   bash: -c: line 0: `IFS=x; ABC=cxd; for i in +($ABC); do echo =$i=; done'
>   $ readlink -f /proc/$$/exe
>   /bin/bash

Yes, you need extglob to get a word like +(xyz) to parse unquoted. Since
the word list following `in' is subject to pathname expansion, it's valid
in that context.

> 
> (I tried inserting shopt -o extglob; and shopt +o extglob; at the start of the
> -c and it didn't change anything?)

Because extglob isn't one of the `set -o' options. I wanted `shopt' to be
suitable to set all the shell options, so it understands -o and o and can
modify the `set -o' option set. You want `shopt -s extglob'.

> Generated code exists and has its costs whether or not you had to manually write
> it. 

Sure. I'm comfortable with the tradeoff  to this point. There are other
things I'd rather work on than writing a new parser.

> 
>>> which said to _me_ that the parsing order of operations is
>>>
>>> A) keep parsing lines of data until you do NOT need another line.
>>>
>>> B) then do what the lines say to do.
>>
>> Roughly, if you mean "complete commands have been resolved with a proper
>> terminator" and "execute the commands you just parsed."
> 
> The execution can be deferred arbitrarily long (you may be defining a function)
> or never (the else case of an if statement that was true), but yeah.

In a way. A function definition is a compound command with a separate exit
status, and it's the `if' command we're talking about here, not its
constituent parts, some of which may indeed never be executed.




> Anyway, that structure needs an "int lineno" added that gets snapshot from the
> global TT.lineno, and what I've learned from all this is it gets snapshot at the
> end when we close out the sh_pipeline and start the next one, not at the
> beginning when it's allocated. (That's the observation that makes the behavior
> make sense now.)

No. Kind of in the middle. Consider the following:

echo \
one \
two \
$LINENO \
done

Bash will always expand $LINENO to 2 in this construct, since it was on
line 2 when it figured out it was parsing a simple command.

> Last time I looked up youtube clips for the princess bride "once his HEAD is in
> range HIT IT WITH THE ROCK", and winnie the pooh "bear of very little brain",
> but I haven't got the spoons to do that again.

You fell victim to one of the classic blunders.

>> You can probably get away with it as long as that option parsing code stops
>> at the first word that doesn't begin with `-'.
> 
> That's literally one character ("^" at the start of the option string in the
> middle argument of the NEWTOY() macro.)

You've lost me there. Are you saying that you use ^ to mean something when
parsing options?


>>> Documenting this as a deviance from <strike>posix</strike> the bash man page
>>> seems the better call in this instance. 
>>
>> Documenting what as a deviation? POSIX doesn't do long options; you can do
>> whatever you like with them.
> 
> My shell standard isn't posix, the standard I'm trying to implement is the bash
> man page.
Then why recommend that I document it as a deviation from something POSIX
doesn't standardize?

>>> These days I handle that sort of thing by waiting for somebody to
>>> complain. That way I only add missing features somebody somewhere actually _uses_.)
>>
>> It has to be a lot more than one person.
> 
> Yeah, but if I'm on the fence about it to begin with it only takes one person to
> confirm "yeah, that's actually used".

Sometimes. I'm not getting paid for any of this; if I implement something
new it has to be something I think is valuable or will pay off in the long
run, or something lots of people are requesting.

> Also, Elliott speaks for the Android userbase. They ship a billion devices
> annually. When he tells me he needs a thing, it carries some weight. (We argue
> about how and where, but "what" is generally a foregone conclusion.)

Sure. The Linux distros play the same role for me, though I did get some
good input from the Solaris guys a while back.

> Yes and no. There's bsd and macos support now, and post-1.0 I might put some of
> my own effort into expanding the BSD side of it. (MacOS is a cross between
> "BSD's downstream" and "a weird proprietary mega-corporation that can sign a
> check if it wants me to care", but Elliott has users who build AOSP on MacOS and
> borrows a laptop to do fixups there every six months or so, and sends me patches.)

I do all my development on Mac OS X and do testing and some debugging on
Linux. But I don't pretend that Apple is ever going to update the bash
version they ship, and I know they're going to try and deprecate it due to
licensing issues, so I don't spend any time putting in anything Mac OS-
specific. Most of the proposals -- even the bad ones -- come from the Linux
side.


>>> It's a pity posix is moribund.
>>
>> It's not dead, just slow.
> 
> Give him time.

I think you give Jorg a lot more credit for influence than he deserves.

> 
>> https://www.austingroupbugs.net/view.php?id=789
>>
>> So we started talking about this in some official proposed way in 2013,
>> continued sporadically until 2018, decided on some official text to add
>> to the standard in September, 2018, and it will be in the next major
>> revision of Posix, issue 8.
> 
> There's going to be an issue 8? 

Yes, Geoff is preparing the document now.

Posix has been replacing issue 7 in place doing
> the "continuous integration" thing (grab random snapshot du jour from the
> website and call it good, no two people ever experience quite the same version)
> for 12 years now.

That's mostly up to the open group, not the people working on the standard
itself.

> (I ranted a lot more here last time in the email that got lost. Probably a good
> thing.)

About release schedules? How much more is there to say about them? I mean,
release engineering is complex, but it doesn't seem like there are that
many new topics to consider.

> I only started using bash in 1998. :)

And it was 10 years old at that time. Man, we've come a long way.


>   If your current locale setting has an appropriate gettext database installed,
>   $"strings" get looked up and replaced with translated versions, otherwise
>   they act like normal double quoted strings. Also, "bash -D SCRIPT" will show
>   you all the $"" strings in a SCRIPT so translators can make a gettext database
>   for a new $LANG.

Pretty much.

Chet
-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
		 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, UTech, CWRU    chet at case.edu    http://tiswww.cwru.edu/~chet/


More information about the Toybox mailing list