blob: b42e07c74ecac838f9bdcea088fb680e962aac1a [file] [log] [blame]
Benjamin Peterson90f5ba52010-03-11 22:53:45 +00001#! /usr/bin/env python3
Guido van Rossumec758ea1991-06-04 20:36:54 +00002
3# Variant of "which".
4# On stderr, near and total misses are reported.
Guido van Rossumfcd1e6e1992-03-02 16:17:31 +00005# '-l<flags>' argument adds ls -l<flags> of each file found.
Guido van Rossumec758ea1991-06-04 20:36:54 +00006
Guido van Rossum9476a781997-10-20 23:48:01 +00007import sys
8if sys.path[0] in (".", ""): del sys.path[0]
9
Walter Dörwaldaaab30e2002-09-11 20:36:02 +000010import sys, os
Guido van Rossumec758ea1991-06-04 20:36:54 +000011from stat import *
12
13def msg(str):
Tim Peters70c43782001-01-17 08:48:39 +000014 sys.stderr.write(str + '\n')
Guido van Rossumec758ea1991-06-04 20:36:54 +000015
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000016def main():
17 pathlist = os.environ['PATH'].split(os.pathsep)
Guido van Rossumec758ea1991-06-04 20:36:54 +000018
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000019 sts = 0
20 longlist = ''
Guido van Rossumfcd1e6e1992-03-02 16:17:31 +000021
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000022 if sys.argv[1:] and sys.argv[1][:2] == '-l':
23 longlist = sys.argv[1]
24 del sys.argv[1]
Guido van Rossumec758ea1991-06-04 20:36:54 +000025
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000026 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)
Andrew Svetlov8b33dd82012-12-24 19:58:48 +020032 except OSError:
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000033 continue
34 if not S_ISREG(st[ST_MODE]):
35 msg(filename + ': not a disk file')
Tim Peters70c43782001-01-17 08:48:39 +000036 else:
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000037 mode = S_IMODE(st[ST_MODE])
Guido van Rossumcd16bf62007-06-13 18:07:49 +000038 if mode & 0o111:
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000039 if not ident:
Collin Winter6afaeb72007-08-03 17:06:41 +000040 print(filename)
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000041 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)
Victor Stinnere7c98f02020-04-02 03:42:47 +020052 sts = os.waitstatus_to_exitcode(sts)
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000053 if sts: msg('"ls -l" exit status: ' + repr(sts))
54 if not ident:
55 msg(prog + ': not found')
56 sts = 1
Guido van Rossumec758ea1991-06-04 20:36:54 +000057
Andrew M. Kuchlinge236b382004-08-09 17:27:55 +000058 sys.exit(sts)
59
60if __name__ == '__main__':
61 main()