Re: Clarification needed on signal spec EXIT

2012-10-21 Thread Francis Moreau
Thanks for answering, however...

On Sat, Oct 20, 2012 at 9:01 PM, Chet Ramey  wrote:
> On 10/16/12 4:00 PM, Bob Proulx wrote:
>> Francis Moreau wrote:
>>> --
>>> main_cleanup () { echo main cleanup; }
>>> submain_cleanup () { echo sub cleanup; }
>>>
>>> trap main_cleanup EXIT
>>>
>>> task_in_background () {
>>> echo "subshell $BASHPID"
>>>
>>> while :; do
>>> # echo "FOO"
>>> sleep 1
>>> done
>>> echo "subshell exiting..."
>>> }
>>>
>>> {
>>> trap submain_cleanup EXIT
>>> trap
>>> task_in_background
>>> } &
>>>
>>> echo exiting...
>>> --
>>>
>>> Sending TERM signal to the subshell doesn't make "submain_cleanup()"
>>> to be called.
>>
>> And it does in ksh93.  Hmm...  And it does if I comment out the line
>> "trap main_cleanup EXIT".  It seems to only set the trap if no trap
>> handler was previously set.
>
> Yes, this is a bug in bash-4.2.  The subshell doesn't properly reinitialize
> the traps if a trap has already been set in the parent.  This was fixed in
> late July and will be in the next version of bash.

That doesn't explain the following (taken from a previous post):

  Even weirder: if the subshell exits by calling "exit 1", then the trap
  handler is not called at all regardless of whether or not the "trap
  main_cleanup EXIT" is commented you.

  To make that case work, you need to use the "( ... ) &" construct
  instead of "{ ... } &" one.

Thanks.
-- 
Francis



Re: Clarification needed on signal spec EXIT

2012-10-21 Thread Chet Ramey
On 10/21/12 7:35 AM, Francis Moreau wrote:

>> Yes, this is a bug in bash-4.2.  The subshell doesn't properly reinitialize
>> the traps if a trap has already been set in the parent.  This was fixed in
>> late July and will be in the next version of bash.
> 
> That doesn't explain the following (taken from a previous post):
> 
>   Even weirder: if the subshell exits by calling "exit 1", then the trap
>   handler is not called at all regardless of whether or not the "trap
>   main_cleanup EXIT" is commented you.
> 
>   To make that case work, you need to use the "( ... ) &" construct
>   instead of "{ ... } &" one.

I think I understand this, but let me make sure.  Where are you putting
the `exit 1'?  If you put it as the last statement in task_in_background,
it works fine.  If you put it after the call to task_in_background in the
lambda subshell, it works fine.  (Both cases with the parent's EXIT trap
commented out and using a brace group.)

Do you mean to replace the call to task_in_background in the lambda
subshell with `exit 1'?  If so, you're right that it doesn't work in
bash-4.2.  It's the same fix from the same bug report:

http://lists.gnu.org/archive/html/bug-bash/2012-07/msg00084.html

The fixes for that report are all in the bash-20120727 snapshot, if you
want to look at that in the devel branch of the git tree on savannah.

Chet
-- 
``The lyf so short, the craft so long to lerne.'' - Chaucer
 ``Ars longa, vita brevis'' - Hippocrates
Chet Ramey, ITS, CWRUc...@case.eduhttp://cnswww.cns.cwru.edu/~chet/