On Tue, Feb 15, 2011 at 05:30:11PM +0000, Jason McIntyre wrote:
> On Mon, Feb 14, 2011 at 11:31:18AM +0000, David Julio wrote:
> > Is the exit status of which(1)/whereis(1) correct?
> > 
> > $ which a b c
> > which: a: Command not found
> > which: b: Command not found
> > which: c: Command not found
> > 
> > $ echo $?
> > 2
> >
> > $ which -a a b c
> > which: a: Command not found
> > which: b: Command not found
> > which: c: Command not found
> > 
> > $ echo $?
> > 1
 
> > If it is incorrect, below is my attempt to contribute.
 
> this command is not covered by posix, so there's no reference there.
> neither free nor netbsd document exit status for this command either.
> 
> i have no access to such systems, but maybe someone who does can tell us
> how other bsd behave?
SunOS 5.10 doesn't document the exit status, doesn't have a -a switch.
Simple check show that  there exit status is 1 if noone are found, 0
if all/some are found.

Linux behaves the same way, but has an exit code of 2 if there where
invalid arguments passed.

DragonflyBSD (And FreeBSD) behave the same, but return 1 if there
where invalid arguments.

No access to a NetBSD box, and there man page doesn't document the
exit status.
   
> if it's a doc bug, it can be fixed easy enough. that would seem strange
> behaviour though. if it's a software bug, any developer want to look at
> this?
What's correct there, I've no idea.

At the very least we should be consistent with our own man page so, the 
diff might be the right solution.

kv, thib

> > Index: which.c
> > ===================================================================
> > RCS file: /cvs/src/usr.bin/which/which.c,v
> > retrieving revision 1.16
> > diff -u -r1.16 which.c
> > --- which.c 31 May 2010 14:01:49 -0000      1.16
> > +++ which.c 14 Feb 2011 11:02:10 -0000
> > @@ -55,11 +55,7 @@
> > 
> >     (void)setlocale(LC_ALL, "");
> > 
> > -   if (argc == 1)
> > -           usage();
> > -
> > -   /* Don't accept command args but check since old whereis(1) used to */
> > -   while ((ch = getopt(argc, argv, "a")) != -1) {
> > +   while ((ch = getopt(argc, argv, "a")) != -1)
> >             switch (ch) {
> >             case 'a':
> >                     allmatches = 1;
> > @@ -67,7 +63,11 @@
> >             default:
> >                     usage();
> >             }
> > -   }
> > +   argc -= optind;
> > +   argv += optind;
> > +
> > +   if (argc == 0)
> > +           usage();
> > 
> >     /*
> >      * which(1) uses user's $PATH.
> > @@ -98,11 +98,11 @@
> >     if (setuid(geteuid()))
> >             err(1, "Can't set uid to %u", geteuid());
> > 
> > -   for (n = optind; n < argc; n++)
> > +   for (n = 0; n < argc; n++)
> >             if (findprog(argv[n], path, progmode, allmatches) == 0)
> >                     notfound++;
> > 
> > -   exit((notfound == 0) ? 0 : ((notfound == argc - 1) ? 2 : 1));
> > +   exit((notfound == 0) ? 0 : ((notfound == argc) ? 2 : 1));
> >  }
> > 
> >  int

Reply via email to