D: 環境変数 PATH や CLASSPATH の値をチェックするツールを書いてみる

PATH や CLASSPATH といった環境変数には「パスのリスト」が設定されるが、パスをたくさん追加していくと、途中で間違いがあっても、ぱっと見わかりづらくなる。
D 言語の入門を兼ねて、コマンドラインで実行できるツールを作ってみることに。

使い方

ソースをコンパイルする。

dmd bazuzu.d

実行する。引数はチェックする環境変数名。

bazuzu CLASSPATH

すると結果が出る。

[CLASSPATH]
f C:\foo\bar\baz.jar
d D:\example\
! D:\exampl\
!

行頭の文字が、チェック結果を表す。

文字 意味
f ファイルがある
d ディレクトリがある
! ファイルもディレクトリもない

上記の出力例で "!" だけの行があるが、これは、環境変数の末尾が区切り文字 (Windows だと ";") で終わっていた場合。先頭が ";" だとか、途中に ";;" がある場合も同様の出力になる。

ソース

以下のソースを bazuzu.d として保存し、DMD 0.145 でコンパイル

private import std.stdio;
private import std.string;
private import std.file;
private import std.path;
private import std.c.stdlib;

int main(char[][] args) {
	if (args.length < 2) {
		writefln("syntax: bazuzu envname");
		return 2;
	}

	char[] name = args[1];
	char[] value = toString(getenv(toStringz(name)));
	if (value.length > 0) {
		writefln("[%s]", name);
		char[][] paths = split(value, pathsep);
		for (int i = 0; i < paths.length; i++) {
			char[] path = paths[i];
			char[] mark;
			if (exists(path) == 1) {
				if (isdir(path)) {
					mark = "d";
				} else {
					mark = "f";
				}
			} else {
				mark = "!";
			}
			writefln("%s %s", mark, path);
		}
		return 0;
	} else {
		writefln("'%s' not found.", name);
		return 1;
	}
}

注意

マルチバイト文字未対応。