about summary refs log tree commit diff
path: root/Src
diff options
context:
space:
mode:
Diffstat (limited to 'Src')
-rw-r--r--Src/builtin.c21
1 files changed, 15 insertions, 6 deletions
diff --git a/Src/builtin.c b/Src/builtin.c
index dfea94477..6cb03b3f5 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3356,11 +3356,12 @@ int
 bin_read(char *name, char **args, char *ops, int func)
 {
     char *reply, *readpmpt;
-    int bsiz, c = 0, gotnl = 0, al = 0, first, nchars = 1, bslash;
+    int bsiz, c = 0, gotnl = 0, al = 0, first, nchars = 1, bslash, keys = 0;
     int haso = 0;	/* true if /dev/tty has been opened specially */
     int isem = !strcmp(term, "emacs"), izle = zleactive && getkeyptr;
     char *buf, *bptr, *firstarg, *zbuforig;
     LinkList readll = newlinklist();
+    FILE *oshout = NULL;
 
     if ((ops['k'] || ops['b']) && *args && idigit(**args)) {
 	if (!(nchars = atoi(*args)))
@@ -3385,8 +3386,11 @@ bin_read(char *name, char **args, char *ops, int func)
 	if (!zleactive) {
 	    if (SHTTY == -1) {
 		/* need to open /dev/tty specially */
-		SHTTY = open("/dev/tty", O_RDWR|O_NOCTTY);
-		haso = 1;
+		if ((SHTTY = open("/dev/tty", O_RDWR|O_NOCTTY)) != -1) {
+		    haso = 1;
+		    oshout = shout;
+		    init_shout();
+		}
 	    }
 	    /* We should have a SHTTY opened by now. */
 	    if (SHTTY == -1) {
@@ -3403,6 +3407,7 @@ bin_read(char *name, char **args, char *ops, int func)
 		setcbreak();
 	    readfd = SHTTY;
 	}
+	keys = 1;
     } else if (ops['u'] && !ops['p']) {
 	/* -u means take input from the specified file descriptor. *
 	 * -up means take input from the coprocess.                */
@@ -3419,9 +3424,9 @@ bin_read(char *name, char **args, char *ops, int func)
 	for (readpmpt = firstarg;
 	     *readpmpt && *readpmpt != '?'; readpmpt++);
 	if (*readpmpt++) {
-	    if (isatty(0)) {
-		zputs(readpmpt, stderr);
-		fflush(stderr);
+	    if (keys || isatty(0)) {
+		zputs(readpmpt, (haso ? shout : stderr));
+		fflush(haso ? shout : stderr);
 	    }
 	    readpmpt[-1] = '\0';
 	}
@@ -3462,6 +3467,8 @@ bin_read(char *name, char **args, char *ops, int func)
 		settyinfo(&shttyinfo);
 	    if (haso) {
 		close(SHTTY);
+		fclose(shout);
+		shout = oshout;
 		SHTTY = -1;
 	    }
 	}
@@ -3493,6 +3500,8 @@ bin_read(char *name, char **args, char *ops, int func)
 	    /* dispose of result appropriately, etc. */
 	    if (haso) {
 		close(SHTTY);
+		fclose(shout);
+		shout = oshout;
 		SHTTY = -1;
 	    }
 	}