which コマンドの実装

which コマンドの実装の書き直し - forest book からです。 以前、which コマンドはawk だけで which (w - 日本 GNU AWK ユーザー会 0.2 で実装しましたが、この場合、引数を 1 つしか取ることができなかったので、複数の引数を取ることができるように改良してみます。

#! /usr/local/bin/nawk -f
# which_2.awk
# which コマンドの代替
# usage: nawk -f which_2.awk file[...]

BEGIN {
    num_path = split(ENVIRON["PATH"], arr_path, ":");
    for (i = 1; i < ARGC; i++) {
        is_exist = 0;
        for (j = 1; j <= num_path; j++) {
            full_path = arr_path[j] "/" ARGV[i];
            if (getline < full_path > 0) {
                print full_path;
                close(full_path);
                is_exist = 1;
                break;
            }
        }
        if (is_exist == 0) {
            print "cannot find " ARGV[i] " command"
        }
    }
}

以前のものと比較すると、for 文がさらに加わったものになっています。 実行すると以下のようになります。

$ nawk -f which_2.awk awk nawk mawk gawk xgawk jawk
/usr/local/bin/awk
/usr/local/bin/nawk
/usr/local/bin/mawk
/usr/local/bin/gawk
/usr/local/bin/xgawk
cannot find jawk command

awk 関連は基本的に自分でビルドしているため、/usr/loca/bin に集中していることが分かります。 なお、jawk は Java による awk の実装ですが、まだ試していません。

tag_nawk.pngtag_nawk.pngtag_nawk.pngtag_nawk.png