17db96d56Sopenharmony_ci#! /usr/bin/env python3 27db96d56Sopenharmony_ci 37db96d56Sopenharmony_ci# Variant of "which". 47db96d56Sopenharmony_ci# On stderr, near and total misses are reported. 57db96d56Sopenharmony_ci# '-l<flags>' argument adds ls -l<flags> of each file found. 67db96d56Sopenharmony_ci 77db96d56Sopenharmony_ciimport sys 87db96d56Sopenharmony_ciif sys.path[0] in (".", ""): del sys.path[0] 97db96d56Sopenharmony_ci 107db96d56Sopenharmony_ciimport sys, os 117db96d56Sopenharmony_cifrom stat import * 127db96d56Sopenharmony_ci 137db96d56Sopenharmony_cidef msg(str): 147db96d56Sopenharmony_ci sys.stderr.write(str + '\n') 157db96d56Sopenharmony_ci 167db96d56Sopenharmony_cidef main(): 177db96d56Sopenharmony_ci pathlist = os.environ['PATH'].split(os.pathsep) 187db96d56Sopenharmony_ci 197db96d56Sopenharmony_ci sts = 0 207db96d56Sopenharmony_ci longlist = '' 217db96d56Sopenharmony_ci 227db96d56Sopenharmony_ci if sys.argv[1:] and sys.argv[1][:2] == '-l': 237db96d56Sopenharmony_ci longlist = sys.argv[1] 247db96d56Sopenharmony_ci del sys.argv[1] 257db96d56Sopenharmony_ci 267db96d56Sopenharmony_ci for prog in sys.argv[1:]: 277db96d56Sopenharmony_ci ident = () 287db96d56Sopenharmony_ci for dir in pathlist: 297db96d56Sopenharmony_ci filename = os.path.join(dir, prog) 307db96d56Sopenharmony_ci try: 317db96d56Sopenharmony_ci st = os.stat(filename) 327db96d56Sopenharmony_ci except OSError: 337db96d56Sopenharmony_ci continue 347db96d56Sopenharmony_ci if not S_ISREG(st[ST_MODE]): 357db96d56Sopenharmony_ci msg(filename + ': not a disk file') 367db96d56Sopenharmony_ci else: 377db96d56Sopenharmony_ci mode = S_IMODE(st[ST_MODE]) 387db96d56Sopenharmony_ci if mode & 0o111: 397db96d56Sopenharmony_ci if not ident: 407db96d56Sopenharmony_ci print(filename) 417db96d56Sopenharmony_ci ident = st[:3] 427db96d56Sopenharmony_ci else: 437db96d56Sopenharmony_ci if st[:3] == ident: 447db96d56Sopenharmony_ci s = 'same as: ' 457db96d56Sopenharmony_ci else: 467db96d56Sopenharmony_ci s = 'also: ' 477db96d56Sopenharmony_ci msg(s + filename) 487db96d56Sopenharmony_ci else: 497db96d56Sopenharmony_ci msg(filename + ': not executable') 507db96d56Sopenharmony_ci if longlist: 517db96d56Sopenharmony_ci sts = os.system('ls ' + longlist + ' ' + filename) 527db96d56Sopenharmony_ci sts = os.waitstatus_to_exitcode(sts) 537db96d56Sopenharmony_ci if sts: msg('"ls -l" exit status: ' + repr(sts)) 547db96d56Sopenharmony_ci if not ident: 557db96d56Sopenharmony_ci msg(prog + ': not found') 567db96d56Sopenharmony_ci sts = 1 577db96d56Sopenharmony_ci 587db96d56Sopenharmony_ci sys.exit(sts) 597db96d56Sopenharmony_ci 607db96d56Sopenharmony_ciif __name__ == '__main__': 617db96d56Sopenharmony_ci main() 62