• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1#! /usr/bin/env python3
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
16def 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 OSError:
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 & 0o111:
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                sts = os.waitstatus_to_exitcode(sts)
53                if sts: msg('"ls -l" exit status: ' + repr(sts))
54        if not ident:
55            msg(prog + ': not found')
56            sts = 1
57
58    sys.exit(sts)
59
60if __name__ == '__main__':
61    main()
62