Bump in case this fell through the cracks. My simple script that uses no job 
control facilities (in fact, turns job control off) if run in the background 
would log the user out on any keyboard input. This can't be right. Can you at 
least confirm that this is indeed a bug in Bash? Are there any work-arounds 
other than not using the DEBUG trap or leaving job control on?

-Mark

    On Tuesday, June 18, 2024 at 02:48:51 PM PDT, Mark March 
<march@systempad.cloud> wrote:  
 
 I am working with a large Bash code base where most scripts disable job 
control and the DEBUG trap is used extensively. I noticed that if I tried to 
run my scripts in the background, the interactive shell that started them would 
immediately exit on any keyboard input. A simple repro is to run

bash +m -c "/bin/echo ; trap 'trap DEBUG' DEBUG ; sleep 10" &
in an interactive shell with job control enabled. Hit Enter a few times. The 
shell that launched this background process exits. The background process 
itself appears to be killed by a signal. I was able to repro this with and 
under Bash-5.2.21 and 5.1.16 on Ubuntu 22.04.4, and with Bash-5.2.15 on MacOS.

The problem seems to be triggered by the following code in run_debug_trap():
if (pipeline_pgrp > 0 && ((subshell_environment & 
(SUBSHELL_ASYNC|SUBSHELL_PIPE)) == 0))
    give_terminal_to (pipeline_pgrp, 1);

give_terminal_to() calls tcsetpgrp (shell_tty, pgrp), which places the calling 
process in the foreground without the parent shell's knowledge. Since the 
parent shell's process group is no longer in the foreground, I suspect it 
receives an EIO from a read(2) and exits, although I was not able to confirm 
this with strace.
In my repro pipeline_pgrp is non-zero at the time of DEBUG trap execution. gdb 
shows that it was set to shell_pgrp in make_child() that forked /bin/echo 
without job control (+m). The other condition of the if statement is also 
satisfied.

-Mark
  

Reply via email to