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

Re: BUG: Shell builtin `which` prints non-existent commands to stdout



On Mon, 24 Sep 2018 14:29:33 +0200
Klaus Alexander Seistrup <klaus@xxxxxxxxxxx> wrote:
> Peter Stephenson wrote:
> 
> > This is not a bug and has been discussed numerous times  
> 
> Thanks, I hadn't see that. I'll just keep the `which` alias, then.

Might be useful to make the issue more visible...

diff --git a/Etc/FAQ.yo b/Etc/FAQ.yo
index a3dfc6c..e15e024 100644
--- a/Etc/FAQ.yo
+++ b/Etc/FAQ.yo
@@ -127,6 +127,7 @@ Chapter 3:  How to get various things to work
 3.26. Why is my output duplicated with `tt(foo 2>&1 >foo.out | bar)'?
 3.27. What are these `^' and `~' pattern characters, anyway?
 3.28. How do I edit the input buffer in $EDITOR?
+3.29. Why does `which' output for missing commands go to stdout?
 
 Chapter 4:  The mysteries of completion
 4.1. What is completion?
@@ -1964,6 +1965,34 @@ label(328)
   quitting the editor will only return to zsh's command-line editing mode.
 
 
+sect(Why does `which' output for missing commands go to stdout?)
+
+  The issue is that if you run:
+  verb(
+    which non-existent-command
+  )
+  the error message goes, unusually, to standard output rather than
+  to standard error.  Other shells send this message to standard error,
+  as they would if the command was about to be executed but could not be
+  found.
+
+  The original reason for this is that this behaviour is inherited
+  from the C shell (csh), where `tt(which)' itself orignated.  So
+  it has been in zsh a very long time, and it is now a feature.
+  (It would be possible to change this in emulation modes; however.
+  so far this possibility has been seen has more of an additional
+  confusion than a help.)
+
+  If you want some further rationalisation, which may be what the C
+  shell designers had in mind, you might note that `tt(which)' is
+  designed as a way of outputing information about a command.  So
+  `this command can be found in ...' and `this command can't be found'
+  are both bits of information here, unlike the case where the command
+  is to be executed.  So although it differs from other Bourne-style
+  shells it is in fact self-consistent.  Note that the status does
+  reflect the fact the command can't be found.
+
+
 chapter(The mysteries of completion)
 
 



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