先日、UNIXの簡単な使い方を職場の若いのに教えていたのですが、UNIXのコマンドって「分かりづらい」って言うんですよね。まあ、基本的なコマンド名からして「ls」「mv」「cp」「rm」「pwd」「cat」、なんのこっちゃさっぱりわからん、というのは無理からぬことかも知れません。
でも、その若いの…DOSコマンドはある程度知っているようでしたが…が言うには、それだけじゃなくてコマンドの出力結果そのものも分かりづらい、って言うんですよね。例えば…
$ ls -lF / total 101 drwxr-xr-x 2 root root 4096 Aug 13 21:54 bin/ drwxr-xr-x 2 root root 4096 Aug 13 21:57 boot/ drwxr-xr-x 5 root root 36864 Oct 29 14:19 dev/ drwxr-xr-x 31 root root 4096 Jan 20 10:00 etc/ drwxr-xr-x 8 root root 4096 Oct 2 16:08 home/ drwxr-xr-x 4 root root 4096 Aug 13 21:38 lib/ drwxr-xr-x 2 root root 16384 Aug 13 21:17 lost+found/ drwxr-xr-x 2 root root 4096 Sep 21 1999 misc/ drwxr-xr-x 4 root root 4096 Aug 13 21:19 mnt/ drwxr-xr-x 2 root root 4096 Aug 24 1999 opt/ dr-xr-xr-x 34 root root 0 Oct 29 23:18 proc/ drwxr-x--- 7 root root 4096 Nov 30 20:18 root/ drwxr-xr-x 3 root root 4096 Oct 2 16:08 sbin/ drwxrwxrwt 14 root root 4096 Jan 28 12:59 tmp/ drwxr-xr-x 20 root root 4096 Aug 13 21:40 usr/ drwxr-xr-x 20 root root 1024 Aug 13 21:56 var/
なんて出力されても、どのフィールドがどういう意味だか分かりづらい、って言うんですね。まあ、DOSコマンドの出力結果…
C:\WINNT>dir c:\ ドライブ C のボリューム ラベルは WIN2000 です ボリューム シリアル番号は 1234-5678 です c:\ のディレクトリ 2000/07/16 09:17 <DIR> Documents and Settings 2000/08/13 12:14 <DIR> Inetpub 2001/01/08 15:01 <DIR> Program Files 2000/09/12 07:40 <DIR> TEMP 2001/01/14 21:34 <DIR> WINNT 0 個のファイル 0 バイト 5 個のディレクトリ 2,171,561,984 バイトの空き領域
なんかと比較すると、UNIXコマンドの場合、全然愛想が無いと言うか、分かりづらいのは確かですね。
ただまあ、これは思想の違いと言うか、UNIXコマンドの場合、その出力結果を別のコマンドの入力にして処理をするようなことも考えに入れて、そういう用途で使いやすいような出力を出すコマンドが多いわけです。
例えば、あるディレクトリにあるファイル・ディレクトリを、最終更新月で集計して、その個数を調べる(←説明が難しい)なんてのも、UNIXの場合は
$ ls -l / | grep -v '^total' | awk '{c[$6]++} END{for(m in c) print m,c[m]}' Sep 1 Jan 2 Nov 1 Oct 4 Aug 8
なんてことが出来ちゃったりするわけでして(←「ls -l」の場合、最初の行に「total 〜」って出ちゃうのがちょっとアレですが…これを出さなくする方法ってありましたっけ?)、いろいろと便利なわけです。
DOS(Windows)コマンドでも、似たようなことは、やろうと思えば出来なくも無いですけど、DIRコマンドの出力結果からして、いろいろと余計なことが書かれているので、そういうことがやり辛かったりするわけです。
DOS/Windowsの場合、コマンドの出力結果は、OSの種類やバージョンによって(下手すると、サービスパックのレベルによって)違っていたりすることがありがちで、コマンドの出力結果を別のプログラムなりコマンドで読ませて…ってのがやり辛いですよね。まあ、UNIXだって、コマンドの出力結果がどのOSやバージョンでも完全に一致しているか、と言えばそんなことは無いわけですけど、DOS/Windowsよりはずっと安心できるわけです。
ところで、そのDOS/Windowsのコマンドと言えば、yomoyomoさんが「窓の五年殺し vs 頼みの網」というコラムの中でWindows95のwinipcfgコマンドについて書かれています。
Windowsのwinipcfgコマンドというのは、TCP/IPの設定についての情報を得るため(だけじゃなくてDHCP関連の操作をやったりも出来ますが)のコマンドで、Windows9x(Meも?)に付いて来ます。NT/2000ですと、ipconfigという別のコマンドになっています。
私自身、このコラムを読むまで、winipcfgにオプションを付けられる、ということすら知らなかったのですが(winipcfg自体、コマンドと言うより、WindowsのGUIアプリケーションですから)、Windows95日本語版では、そのオプションまで中途半端に日本語化(と言うのか?)してあって困った、ということみたいです。
しかし、英語版の「winipcfg /all」が日本語版では「winipcfg /全」になる、なんてのは、一体何を考えて日本語化したんだ、と思っちゃいますけど…どうせならそんな中途半端なことしないで、思いきってコマンド名まで日本語化せんかい > マイクロソフト。
まあ冗談はとりあえず置いておいて、そもそも自分のIPアドレスを(プログラム中から)知るためにwinipcfgを使う、ってのは結構やだなー、と言うか、やりたくないなー、ってってのが私の感想です(←yomoyomoさんのコラムを読めば分かりますけど、彼がそういうことをやろうとしたわけじゃなくて、そういう実装のものがすでにあった、ということです、念のため)。
オプションが変だ、という他にも、そもそもNT系列にはwinipcfgは無い(Resource Kitには英語版ならあったような気がするが…)ので、そっちではipconfigを使わないといけないし、そもそも出力結果を、少なくとも現在あるWindowsのバージョン/言語/サービスパックについて全部調べて、正しい結果が得られるようにプログラムを作らないといけないですし、出来れば将来のバージョンでも可能な限り修正しなくても動くような作りにしないといけない、となると…。
じゃあ、自分のIPアドレス(の全て)を知る、ってのの正しい方法は…どうやるんだろ? 私もやったこと無いから分からない。APIで全部やるのが一番安心できそうですけど、どうやるんだろ。
あとは、レジストリを覗く、ってのもアリかなあ、と思ったのですけど、PnPで今現在生きていないインターフェースの情報は省かないといけないし、DHCPの場合はどうなるんだろ、とかいろいろ考えると、これもちょっと…。
って考えてゆくと、まあwinipcfg/ipconfigを使うのは、安直だけど、楽といえば楽ですね。でも、他に安直でいい方法は無いかなあ。どうせコマンドでやるなら、「route print」でルーティングテーブルを取得して、そこから拾った方がラクかも?