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