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; } }