Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

[patch] "which"-builtin writes diagnostics to stdout



When invoking the `which` builtin for something that does not exist, like:

| % which doesnotexist
| doesnotexist not found

the "doesnotexist not found" message goes to standard output, rather than standard error.

This is of course wrong, and particularly nasty in command-substitution, where the diagnostic message might end up in a variable, be given to an external program as an arguemnt or even be be fed through a pipeline.

The below (and also attached) patch fixes that.


Cheers,

Timo Buhrmester

---------8<------------------------------------------------

diff --git a/Src/builtin.c b/Src/builtin.c
index 97022ad..774390a 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3578,8 +3578,9 @@ bin_whence(char *nam, char **argv, Options ops, int func)
 		}
 	    }
 	    if (!informed && (wd || v || csh)) {
-		zputs(*argv, stdout);
-		puts(wd ? ": none" : " not found");
+		zputs(*argv, stderr);
+		fputs(wd ? ": none" : " not found", stderr);
+		fputc('\n', stderr);
 		returnval = 1;
 	    }
 	    popheap();
@@ -3598,8 +3599,11 @@ bin_whence(char *nam, char **argv, Options ops, int func)
 	    informed = 1;
 	} else {
 	    /* Not found at all. */
-	    if (v || csh || wd)
-		zputs(*argv, stdout), puts(wd ? ": none" : " not found");
+	    if (v || csh || wd) {
+		zputs(*argv, stderr);
+		fputs(wd ? ": none" : " not found", stderr);
+		fputc('\n', stderr);
+	    }
 	    returnval = 1;
 	}
     }
diff --git a/Src/builtin.c b/Src/builtin.c
index 97022ad..774390a 100644
--- a/Src/builtin.c
+++ b/Src/builtin.c
@@ -3578,8 +3578,9 @@ bin_whence(char *nam, char **argv, Options ops, int func)
 		}
 	    }
 	    if (!informed && (wd || v || csh)) {
-		zputs(*argv, stdout);
-		puts(wd ? ": none" : " not found");
+		zputs(*argv, stderr);
+		fputs(wd ? ": none" : " not found", stderr);
+		fputc('\n', stderr);
 		returnval = 1;
 	    }
 	    popheap();
@@ -3598,8 +3599,11 @@ bin_whence(char *nam, char **argv, Options ops, int func)
 	    informed = 1;
 	} else {
 	    /* Not found at all. */
-	    if (v || csh || wd)
-		zputs(*argv, stdout), puts(wd ? ": none" : " not found");
+	    if (v || csh || wd) {
+		zputs(*argv, stderr);
+		fputs(wd ? ": none" : " not found", stderr);
+		fputc('\n', stderr);
+	    }
 	    returnval = 1;
 	}
     }


Messages sorted by: Reverse Date, Date, Thread, Author