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