- Notifications
You must be signed in to change notification settings - Fork 31.8k
/
Copy pathwhich.py
executable file
·60 lines (50 loc) · 1.59 KB
/
which.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#! /usr/bin/env python
# Variant of "which".
# On stderr, near and total misses are reported.
# '-l<flags>' argument adds ls -l<flags> of each file found.
importsys
ifsys.path[0] in (".", ""): delsys.path[0]
importsys, os
fromstatimport*
defmsg(str):
sys.stderr.write(str+'\n')
defmain():
pathlist=os.environ['PATH'].split(os.pathsep)
sts=0
longlist=''
ifsys.argv[1:] andsys.argv[1][:2] =='-l':
longlist=sys.argv[1]
delsys.argv[1]
forproginsys.argv[1:]:
ident= ()
fordirinpathlist:
filename=os.path.join(dir, prog)
try:
st=os.stat(filename)
exceptos.error:
continue
ifnotS_ISREG(st[ST_MODE]):
msg(filename+': not a disk file')
else:
mode=S_IMODE(st[ST_MODE])
ifmode&0111:
ifnotident:
printfilename
ident=st[:3]
else:
ifst[:3] ==ident:
s='same as: '
else:
s='also: '
msg(s+filename)
else:
msg(filename+': not executable')
iflonglist:
sts=os.system('ls '+longlist+' '+filename)
ifsts: msg('"ls -l" exit status: '+repr(sts))
ifnotident:
msg(prog+': not found')
sts=1
sys.exit(sts)
if__name__=='__main__':
main()