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;
}
}
注意
マルチバイト文字未対応。