| #! /usr/bin/env python | 
 |  | 
 | # Variant of "which". | 
 | # On stderr, near and total misses are reported. | 
 | # '-l<flags>' argument adds ls -l<flags> of each file found. | 
 |  | 
 | import sys | 
 | if sys.path[0] in (".", ""): del sys.path[0] | 
 |  | 
 | import sys, os, string | 
 | from stat import * | 
 |  | 
 | def msg(str): | 
 |     sys.stderr.write(str + '\n') | 
 |  | 
 | pathlist = string.splitfields(os.environ['PATH'], ':') | 
 |  | 
 | sts = 0 | 
 | longlist = '' | 
 |  | 
 | if sys.argv[1:] and sys.argv[1][:2] == '-l': | 
 |     longlist = sys.argv[1] | 
 |     del sys.argv[1] | 
 |  | 
 | for prog in sys.argv[1:]: | 
 |     ident = () | 
 |     for dir in pathlist: | 
 |         file = os.path.join(dir, prog) | 
 |         try: | 
 |             st = os.stat(file) | 
 |         except os.error: | 
 |             continue | 
 |         if not S_ISREG(st[ST_MODE]): | 
 |             msg(file + ': not a disk file') | 
 |         else: | 
 |             mode = S_IMODE(st[ST_MODE]) | 
 |             if mode & 0111: | 
 |                 if not ident: | 
 |                     print file | 
 |                     ident = st[:3] | 
 |                 else: | 
 |                     if st[:3] == ident: | 
 |                         s = 'same as: ' | 
 |                     else: | 
 |                         s = 'also: ' | 
 |                     msg(s + file) | 
 |             else: | 
 |                 msg(file + ': not executable') | 
 |         if longlist: | 
 |             sts = os.system('ls ' + longlist + ' ' + file) | 
 |             if sts: msg('"ls -l" exit status: ' + `sts`) | 
 |     if not ident: | 
 |         msg(prog + ': not found') | 
 |         sts = 1 | 
 |  | 
 | sys.exit(sts) |