bug-bash
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: bash uses stderr instead of /dev/tty ?


From: Padraig Brady
Subject: Re: bash uses stderr instead of /dev/tty ?
Date: Thu, 12 Jul 2001 23:09:45 +0100
User-agent: Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.2) Gecko/20010628

Doh! I really hate when I do that
patch attached.

Padraig.

Padraig Brady wrote:

Replying to myself, the following patch adds the --tty-prompt
option to bash, which does as explained below. This allows
me to "exec 2> someplace" and get desired results.
Is there any issues with doing this? Quick testing showed no
problems.

To apply patch:
cd bash-2.05
patch -p1 <bash-2.05-tty-prompt.diff

cheers,
Padraig.

Padraig Brady wrote:

Why does bash print it's prompt/command line to stderr
and not /dev/tty? This is silly in my opinion. I noticed
it when I tried to redirect stderr to someplace (a colorizing
program) as follows:

exec 2> someplace

When I did this, everything worked fine, except the
prompt and command line were put in someplace
which I didn't want.

cheers,
Padraig.

diff -aru bash-2.05/bashline.c bash-pb/bashline.c
--- bash-2.05/bashline.c        Tue Mar  6 18:36:07 2001
+++ bash-pb/bashline.c  Thu Jul 12 22:12:47 2001
@@ -216,7 +216,8 @@
 
   rl_terminal_name = get_string_value ("TERM");
   rl_instream = stdin;
-  rl_outstream = stderr;
+  //rl_outstream = stderr;
+  rl_outstream = prompt_FILE;
 
   /* Allow conditional parsing of the ~/.inputrc file. */
   rl_readline_name = "Bash";
diff -aru bash-2.05/general.c bash-pb/general.c
--- bash-2.05/general.c Wed Feb 28 18:23:24 2001
+++ bash-pb/general.c   Thu Jul 12 22:37:59 2001
@@ -292,7 +292,7 @@
 #endif /* __BEOS__ */
 
 void
-check_dev_tty ()
+check_dev_tty (FILE** tty_FILE)
 {
   int tty_fd;
   char *tty;
@@ -306,7 +306,10 @@
        return;
       tty_fd = open (tty, O_RDWR|O_NONBLOCK);
     }
-  close (tty_fd);
+  if (tty_FILE)
+    *tty_FILE = fdopen(tty_fd, "w");
+  else
+    close (tty_fd);
 }
 
 /* Return 1 if PATH1 and PATH2 are the same file.  This is kind of
diff -aru bash-2.05/general.h bash-pb/general.h
--- bash-2.05/general.h Wed Feb 14 21:53:05 2001
+++ bash-pb/general.h   Thu Jul 12 22:47:19 2001
@@ -21,6 +21,8 @@
 #if !defined (_GENERAL_H_)
 #define _GENERAL_H_
 
+#include <stdio.h>
+
 #include "stdc.h"
 
 #include "bashtypes.h"
@@ -218,7 +220,7 @@
 extern int check_identifier __P((WORD_DESC *, int));
 
 extern int sh_unset_nodelay_mode __P((int));
-extern void check_dev_tty __P((void));
+extern void check_dev_tty __P((FILE** tty_FILE));
 extern int same_file ();       /* too many problems with prototype */
 extern int move_to_high_fd __P((int, int, int));
 extern int check_binary_file __P((unsigned char *, int));
diff -aru bash-2.05/print_cmd.c bash-pb/print_cmd.c
--- bash-2.05/print_cmd.c       Tue Apr  3 20:05:26 2001
+++ bash-pb/print_cmd.c Thu Jul 12 22:15:26 2001
@@ -314,22 +314,22 @@
   WORD_LIST *w;
   char *t, *x;
 
-  fprintf (stderr, "%s", indirection_level_string ());
+  fprintf (prompt_FILE, "%s", indirection_level_string ());
   for (w = list; w; w = w->next)
     {
       t = w->word->word;
       if (t == 0 || *t == '\0')
-       fprintf (stderr, "''%s", w->next ? " " : "");
+       fprintf (prompt_FILE, "''%s", w->next ? " " : "");
       else if (sh_contains_shell_metas (t))
        {
          x = sh_single_quote (t);
-         fprintf (stderr, "%s%s", x, w->next ? " " : "");
+         fprintf (prompt_FILE, "%s%s", x, w->next ? " " : "");
          free (x);
        }
       else
-       fprintf (stderr, "%s%s", t, w->next ? " " : "");
+       fprintf (prompt_FILE, "%s%s", t, w->next ? " " : "");
     }
-  fprintf (stderr, "\n");
+  fprintf (prompt_FILE, "\n");
 }
 
 static void
@@ -586,10 +586,10 @@
 debug_print_cond_command (cond)
      COND_COM *cond;
 {
-  fprintf (stderr, "DEBUG: ");
+  fprintf (prompt_FILE, "DEBUG: ");
   command_string_index = 0;
   print_cond_command (cond);
-  fprintf (stderr, "%s\n", the_printed_command);
+  fprintf (prompt_FILE, "%s\n", the_printed_command);
 }
 #endif
 
@@ -600,24 +600,24 @@
      char *arg1, *arg2;
 {
   command_string_index = 0;
-  fprintf (stderr, "%s", indirection_level_string ());
-  fprintf (stderr, "[[ ");
+  fprintf (prompt_FILE, "%s", indirection_level_string ());
+  fprintf (prompt_FILE, "[[ ");
   if (invert)
-    fprintf (stderr, "! ");
+    fprintf (prompt_FILE, "! ");
 
   if (type == COND_UNARY)
     {
-      fprintf (stderr, "%s ", op->word);
-      fprintf (stderr, "%s", (arg1 && *arg1) ? arg1 : "''");
+      fprintf (prompt_FILE, "%s ", op->word);
+      fprintf (prompt_FILE, "%s", (arg1 && *arg1) ? arg1 : "''");
     }
   else if (type == COND_BINARY)
     {
-      fprintf (stderr, "%s", (arg1 && *arg1) ? arg1 : "''");
-      fprintf (stderr, " %s ", op->word);
-      fprintf (stderr, "%s", (arg2 && *arg2) ? arg2 : "''");
+      fprintf (prompt_FILE, "%s", (arg1 && *arg1) ? arg1 : "''");
+      fprintf (prompt_FILE, " %s ", op->word);
+      fprintf (prompt_FILE, "%s", (arg2 && *arg2) ? arg2 : "''");
     }
 
-  fprintf (stderr, " ]]\n");
+  fprintf (prompt_FILE, " ]]\n");
 }        
 #endif /* COND_COMMAND */
 
@@ -629,11 +629,11 @@
 {
   WORD_LIST *w;
 
-  fprintf (stderr, "%s", indirection_level_string ());
-  fprintf (stderr, "(( ");
+  fprintf (prompt_FILE, "%s", indirection_level_string ());
+  fprintf (prompt_FILE, "(( ");
   for (w = list; w; w = w->next)
-    fprintf (stderr, "%s%s", w->word->word, w->next ? " " : "");
-  fprintf (stderr, " ))\n");
+    fprintf (prompt_FILE, "%s%s", w->word->word, w->next ? " " : "");
+  fprintf (prompt_FILE, " ))\n");
 }
 #endif
 
diff -aru bash-2.05/shell.c bash-pb/shell.c
--- bash-2.05/shell.c   Tue Mar 27 15:25:51 2001
+++ bash-pb/shell.c     Thu Jul 12 22:53:51 2001
@@ -188,6 +188,7 @@
 int dump_translatable_strings; /* Dump strings in $"...", don't execute. */
 int dump_po_strings;           /* Dump strings in $"..." in po format */
 int wordexp_only = 0;          /* Do word expansion only */
+int split_stderr = 0;       /* Don't print prompt/command line to stderr */
 
 /* Some long-winded argument names.  These are obviously new. */
 #define Int 1
@@ -212,6 +213,7 @@
 #if defined (RESTRICTED_SHELL)
   { "restricted", Int, &restricted, (char **)0x0 },
 #endif
+  { "tty-prompt", Int, &split_stderr, (char **)0x0 },  
   { "verbose", Int, &echo_input_at_read, (char **)0x0 },
   { "version", Int, &do_version, (char **)0x0 },
   { "wordexp", Int, &wordexp_only, (char **)0x0 },
@@ -240,6 +242,7 @@
 static char *local_pending_command;
 
 static FILE *default_input;
+FILE *prompt_FILE;
 
 static int parse_long_options ();
 static int parse_shell_options ();
@@ -304,7 +307,7 @@
   if (code)
     exit (2);
 
-  check_dev_tty ();
+  check_dev_tty (&prompt_FILE);
 
 #ifdef __CYGWIN__
   _cygwin32_check_tmp ();
@@ -386,6 +389,12 @@
     {
       login_shell++;
       login_shell = -login_shell;
+    }
+
+  if (!split_stderr)
+    {
+      fclose(prompt_FILE);
+      prompt_FILE = stderr;
     }
 
   /* All done with full word options; do standard shell option parsing.*/
diff -aru bash-2.05/shell.h bash-pb/shell.h
--- bash-2.05/shell.h   Sat Oct 14 22:33:01 2000
+++ bash-pb/shell.h     Thu Jul 12 22:17:14 2001
@@ -18,6 +18,7 @@
    with Bash; see the file COPYING.  If not, write to the Free Software
    Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 
+#include <stdio.h>
 #include "config.h"
 
 #include "bashjmp.h"
@@ -105,3 +106,5 @@
 };
 
 extern struct user_info current_user;
+
+extern FILE *prompt_FILE;

reply via email to

[Prev in Thread] Current Thread [Next in Thread]