which コマンドの実装

2008/04/10 追記:
id:michisu:20080410#p1 で書き直してくれました(^ ^;;
2^8 ぐらい、そちらの方がきれいです。
こんな駄コードは見ず、そちらをご覧ください。

要件定義/目的: 環境変数 PATH からコマンドの絶対パスを取得する
自己アピール: なし(単なる勉強)
コメント: 最後の詰めが汚い、もう少し洗練できそう、シェルスクリプトで書いた方が簡単かも?

#!/bin/env python

import os, sys, glob

cmd_name = sys.argv[1]
path_list = [ item for item in os.environ['PATH'].split(':') ]
path_to_file = [ glob.glob(str(item) + '/' + cmd_name) for item in set(path_list) ] # list comprehension
#path_to_file = map( (lambda item: glob.glob(str(item) + '/' + cmd_name) ), set(path_list)) # map function
path_to_cmd = "Not such command"

i=0
while i < len(path_to_file):
    for item in path_to_file[i]:
        if os.access(item, 1):
            path_to_cmd = item
    i += 1

print path_to_cmd
  • 実行結果
$ echo $PATH
/usr/kerberos/bin:/bin:/usr/bin:/usr/local/bin:/usr/lib/qt3/bin:/sbin:/usr/sbin:/usr/local/sbin:/usr/local/bin

$ python which.py which
/usr/bin/which

$ python which.py ls
/bin/ls

$ python which.py xgawk
/usr/local/bin/xgawk

$ ls -al /usr/local/bin/fake_cmd
 -rw-r--r-- 1 root root 0 2008-04-09 08:12 /usr/local/bin/fake_cmd
$ python which.py fack_cmd
Not such command