Home | History | Annotate | Download | only in scripts
      1 #! /usr/bin/env python

      2 
      3 # Variant of "which".

      4 # On stderr, near and total misses are reported.

      5 # '-l<flags>' argument adds ls -l<flags> of each file found.

      6 
      7 import sys
      8 if sys.path[0] in (".", ""): del sys.path[0]
      9 
     10 import sys, os
     11 from stat import *
     12 
     13 def msg(str):
     14     sys.stderr.write(str + '\n')
     15 
     16 def main():
     17     pathlist = os.environ['PATH'].split(os.pathsep)
     18 
     19     sts = 0
     20     longlist = ''
     21 
     22     if sys.argv[1:] and sys.argv[1][:2] == '-l':
     23         longlist = sys.argv[1]
     24         del sys.argv[1]
     25 
     26     for prog in sys.argv[1:]:
     27         ident = ()
     28         for dir in pathlist:
     29             filename = os.path.join(dir, prog)
     30             try:
     31                 st = os.stat(filename)
     32             except os.error:
     33                 continue
     34             if not S_ISREG(st[ST_MODE]):
     35                 msg(filename + ': not a disk file')
     36             else:
     37                 mode = S_IMODE(st[ST_MODE])
     38                 if mode & 0111:
     39                     if not ident:
     40                         print filename
     41                         ident = st[:3]
     42                     else:
     43                         if st[:3] == ident:
     44                             s = 'same as: '
     45                         else:
     46                             s = 'also: '
     47                         msg(s + filename)
     48                 else:
     49                     msg(filename + ': not executable')
     50             if longlist:
     51                 sts = os.system('ls ' + longlist + ' ' + filename)
     52                 if sts: msg('"ls -l" exit status: ' + repr(sts))
     53         if not ident:
     54             msg(prog + ': not found')
     55             sts = 1
     56 
     57     sys.exit(sts)
     58 
     59 if __name__ == '__main__':
     60     main()
     61