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

Chet Ramey chet.ramey at case.edu
Sun May 24 13:46:38 PDT 2020


On 5/23/20 8:59 PM, Rob Landley wrote:

>>> It's there in each new terminal tab. It's not a thing I typed.
>>
>> Maybe run `bash -x' or `bash --login -x' and see where it gets set.
> 
> Scrolled off the terminal history. Let's see...
> 
>   $ bash -x 2>&1 | tee florp.txt
>   exit
>   + exit
> 
> And that produces an almost empty file.

It't not an interactive shell, and won't source the startup files.

>>> ... can aliases expand to unbalanced ( or { ?
>>
>> Yes. The way to implement aliases is to check for an alias expansion in the
>> lexer before you return a WORD, and if you have one, push the expanded text
>> onto the input stack and restart the read.
> 
>   $ alias potato=iguana
>   $ echo potato
>   potato
> 
> It's not the generic "gimme next word" parsing that's doing alias substitution,
> it's the first word in a line that gets substituted (presumably after it's been
> returned as a word).

Well, of course: the word has to be in a position that can be the first
word of a simple command, but the expansion does not have to be a simple
command. That's a basic aspect of alias expansion that all shells
implement.

>>>>> So in bash, $LINENO isn't the starting line of a multi-line span, and it isn't
>>>>> the ending line of a multi-line span, it's the SECOND line of a multi-line span.
>>>>
>>>> No. Consider one of the original examples:
>>>>
>>>> echo $LINENO \
>>>> $LINENO
>>>>
>>>> The shell has already recognized this as a simple command by the time it
>>>> sees the backslash-newline pair.
>>>
>>>   $ echo $LINENO \
>>>   > $LINENO \
>>>   > $LINENO
>>>   1 1 1
>>>
>>>   $ bash -c $'echo $LINENO \\\n$LINENO'
>>>   0 0
>>>
>>> Wait, why's it not doing it now?
>>
>> We already agreed that starting LINENO at 0 in -c command was a bug, and
>> I fixed it several weeks ago.
> 
> No, I meant the LINENO on the second line isn't noticing it's on a later line,
> it's now reporting the first line for both LINENOs, and I thought my initial
> confusion was about it NOT doing that?

I'm not sure myself.

The backslash-newline gets removed, so the command is a single logical
line, which, since the lexer was on line 1 when the parser figured out it
was parsing a simple command, is all on line 1. The simple command gets
the line number where the lexer is when the parser reduces to a simple
command. That's definitely a yacc/bison artifact.

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