Hi.

It seems the -i switch of the bash doesn't work as expected
these days (I tried with bash-4.1).
I've found 2 places of the breakage.

1. initialize_job_control () has the following code:
---
  if (interactive == 0)
    {
      job_control = 0;
      original_pgrp = NO_PID;
      shell_tty = fileno (stderr);
    }
  else
    {
      shell_tty = -1;
   
      /* If forced_interactive is set, we skip the normal check that stderr
 is attached to a tty, so we need to check here.  If it's not, we
 need to see whether we have a controlling tty by opening /dev/tty,
 since trying to use job control tty pgrp manipulations on a non-tty
 is going to fail. */
      if (forced_interactive && isatty (fileno (stderr)) == 0)
---

But, -i sets "interactive_shell" variable, not "interactive", so the
aforementioned comment and code makes no sense, though it
might have been working in the past.

2. waitchld() has the code like this:
---
      /* We don't want to be notified about jobs stopping if job control
         is not active.  XXX - was interactive_shell instead of
job_control */
      waitpid_flags = (job_control && subshell_environment == 0)
                        ? (WUNTRACED|wcontinued)
                        : 0;
---

In particular, the XXX part makes sense: it used to work when it
was checking "interactive_shell" (for the reason mentioned above),
but now it doesn't because "job_control" gets reset together with
"interactive".

The result of this all is that if some script is being run with
"bash -i" and that script starts some binary, bash wouldn't honour
the SIGSTOP sent to that binary.

I made a quick patch to fix the problem, it is attached.
Can someone please take a look into that?

(please CC me the replies)
--- shell.c.old 2009-11-19 18:05:54.000000000 +0300
+++ shell.c     2011-12-26 16:55:08.452997751 +0400
@@ -1625,8 +1625,13 @@
 static void
 init_interactive_script ()
 {
-  init_noninteractive ();
-  expand_aliases = interactive_shell = startup_state = 1;
+  init_interactive ();
+#if defined (HISTORY)
+  bash_history_reinit (0);
+#endif /* HISTORY */
+  expand_aliases = posixly_correct;    /* XXX - was 0 not posixly_correct */
+  no_line_editing = 1;
+  interactive = 0;
 }
 
 void
--- jobs.c.old  2009-11-30 01:12:05.000000000 +0300
+++ jobs.c      2011-12-26 16:56:13.716721461 +0400
@@ -3581,7 +3581,7 @@
     }
 
   /* We can only have job control if we are interactive. */
-  if (interactive == 0)
+  if (interactive_shell == 0)
     {
       job_control = 0;
       original_pgrp = NO_PID;

Reply via email to