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