which.py revision 9476a78c1e310ecea0ceb953e36ec7e2d8f67856
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, string
11from stat import *
12
13def msg(str):
14	sys.stderr.write(str + '\n')
15
16pathlist = string.splitfields(os.environ['PATH'], ':')
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		file = os.path.join(dir, prog)
29		try:
30			st = os.stat(file)
31		except os.error:
32			continue
33		if not S_ISREG(st[ST_MODE]):
34			msg(file + ': not a disk file')
35		else:
36			mode = S_IMODE(st[ST_MODE])
37			if mode & 0111:
38				if not ident:
39					print file
40					ident = st[:3]
41				else:
42					if st[:3] == ident:
43						s = 'same as: '
44					else:
45						s = 'also: '
46					msg(s + file)
47			else:
48				msg(file + ': not executable')
49		if longlist:
50			sts = os.system('ls ' + longlist + ' ' + file)
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