[Toybox] Would someone please explain what bash is doing here?
    Rob Landley 
    rob at landley.net
       
    Fri Apr 24 12:07:46 PDT 2020
    
    
  
On 4/24/20 10:55 AM, Chet Ramey wrote:
> On 4/24/20 9:48 AM, Rob Landley wrote:
>> Try this in bash, and hit ctrl-Z before it returns:
>>
>>   /bin/echo $(ls /usr/bin; sleep 5)
>>
>> Now try to get your terminal back. (Prompt doesn't come back, timeout doesn't
>> happen, ctrl-c doesn't work...)
> 
> It has no effect. The command substitution isn't a job, and it's in the
> same process group as the parent shell (as is the terminal). It's run by
> the parent before it forks to run /bin/echo.
> 
> Hitting ^C kills it.
Yes and no:
  $ /bin/echo $(sleep 5)
  ^Z^C
  $ /bin/echo $(ls /usr/bin; sleep 5)
  ^Z^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C
If something produces enough pending output to clog the pipe, then no, ctrl-C
doesn't kill it after the ctrl-Z. (Hence using /usr/bin which should reliably
have enough contents to do so.) No idea what's going on under the covers.
Unfortunately, strace isn't helpful because of course:
  $ bash -c '/bin/echo $(ls /usr/bin; sleep 5)'
  ^Z
  [1]+  Stopped                 bash -c '/bin/echo $(ls /usr/bin; sleep 5)'
It _looks_ like what's happening is ctrl-z is actually suspending the active
shell attached to the terminal, and thus you don't get the prompt back. Hmmm...
  $ echo $$
  17914
  $ /bin/echo $(ls /usr/bin; sleep 5)
  ^Z^C^C^C^C^C
[and in another terminal]
  $ kill -CONT 17914
  $ ps 17914
    PID TTY      STAT   TIME COMMAND
  17914 pts/91   Ss     0:00 bash
  $ kill -CONT 17914
  $ kill -CONT 17914
Not resuming it. Not looping eating CPU either...
  $ ps ax | grep sleep
   1347 pts/29   T+     0:00 sleep 5
   1407 pts/12   T+     0:00 sleep 5
  18320 pts/91   T+     0:00 sleep 5
Ah-ha! What on earth is...
               T    stopped by job control signal
Right.
  $ kill -CONT 18320
THAT unblocked/resumed it. (The pending ctrl-C were still ignored, it spat out
the ls output instead. Yes Linux should probably wake up stopped jobs when their
tty closes, but it doesn't.)
> I tested on Mac OS using bash-5.0 and bash-4.4. I'm not really interested
> in testing versions before that.
  $ bash --version
  GNU bash, version 4.4.12(1)-release (x86_64-pc-linux-gnu)
Devuan ascii 2.0 which is basically debian.
*shrug* If it doesn't reproduce for you, it doesn't reproduce. Seems impolite
_not_ to mention these things when I hit 'em since you've been so helpful.
This is just collateral damage while I'm still off testing 8 gazillion corner
cases trying to figure out the order of operations in ${a/b/c} style decorated
variable resolution. I've had to rip out and redo largeish chunks of my variable
resolution code TWICE since starting down this sinkhole:
  $ chicken() { echo ${*/b c/ghi}; }; chicken a b c d
  a b c d
(On the bright side, that made me finally understand what bash means with its
array stuff: on the resolution side it's just recycling the $@ plumbing it
already had to implement, which already got genericized for ${!bork}. Still
dunno what the associative arrays mean but it SMELLS like I can just store
keyword=value contents in that array and recycle the variable resolution logic.
Yeah it's not a hash table, but it's _small_ and the common case is <5k entries
which is cache local on a modern processor anyway. Wait for somebody to complain...)
Rob
    
    
More information about the Toybox
mailing list