読者です 読者をやめる 読者になる 読者になる

treedown’s Report

システム管理者に巻き起こる様々な事象を読者の貴方へ報告するブログです。会社でも家庭でも"システム"に携わるすべての方の共感を目指しています。

レガシー基礎知識:コマンドの内部コマンドと外部コマンドってご存知?

バッチ・スクリプト

今日は基礎知識というかもはや現代では雑学というレベルのDOS基礎知識(豆知識)を一点ご報告します。

外部コマンドと内部コマンド、という2種類のコマンドについてです。

きょうびDOSなど使わない、というご時世なのは認識していますが、雑学程度で頭に入れておくとレガシーなエンジニアとの会話に使えるかもしれません。
レガシーなエンジニアは大体DOS時代にPCを使っていることが多いです。

それぞれをざっくり説明

DOSコマンドを入力する際に、例えばpingなら、「ping XXX.XXX.XXX.XXX」のようにします。
pingコマンドは外部コマンド、といいまして、%SYSTEMROOT%内に「ping.exe」というバイナリファイルが用意されています。

f:id:treedown:20160301101047p:plain

内部コマンド、というのはOSの中にあらかじめ用意されているコマンドです。過去のMS-DOSというOSでいえばCOMMAND.COMというファイルの内部に組み込まれています。基本的なファイル操作機能を主に提供するコマンド群でOSが起動していれば絶対使える、という種類の機能です。UNIXの世界ではでは組み込みコマンドとも呼ばれています。
外部コマンド、というのは独立したファイル(例えば.exeファイル)として用意されているプログラムです。要するにバイナリファイルである.exeファイルが単体でファイルとして存在していないと実行ができないコマンドです。大部分のこれらのファイルは、.exeのほかに~.comファイルで用意されています。

DOS内部コマンド

MS-DOSというOSでいえばCOMMAND.COMが正常にロードされていればOSが使える状態になっていて、使える機能が内部コマンドなのですが内部コマンドは機能がかなり限られているので、最低限、以下の動作しかできません。

  • DIR=ファイル・ディレクトリ一覧で参照  UNIXのlsコマンドに当たります。
  • CD=カレントディレクトリの移動
  • COPY=ファイルのコピー  UNIXのcpに当たります。
  • DEL=ファイルの削除  UNIXのrmに当たります。
  • REN=ファイル名の変更  mvのファイル名を変更する機能のみを提供します。
  • TYPE=ファイルの内容を画面に表示する。UNIXのcatに当たります。
  • MD=ディレクトリの作成。UNIXのmkdirにあたります。
  • RD=ディレクトリの削除UNIXではrmdirです
  • CLS=コンソールをプロンプトだけにする。画面のクリアをします。UNIXではclearです。
  • DATE=日時の表示設定を行う。UNIXのdateに当たります。
  • TIME=時間の設定を行い、UNIXではdateに含まれます。
  • PATH=コマンド検索パスを表示設定する。UNIXでは環境変数の設定に使うコマンドのsetenvの中で使うpathと同様です。
  • VER=MS-DOSのバージョンを表示する。UNIXでは存在しない?

逆に言うと、これらのコマンドは~.exeのように実行ファイルとして用意されているわけではありません。(ファイルが存在しません。)

上記以外で日常利用するpingコマンドやxcopyコマンドのような上記以外のコマンドはすべてバイナリファイル(.exeファイルなど)で用意されている外部コマンドです。

おまけ(MS-DOS寄りの話)

前出のCOMMAND.COMに加えてIO.SYS/MSDOS.SYSの3つのファイルがあれば、DOSというOSの最低限の機能は利用することができます。つまり目の前のPCで何らかのOSを起動することが可能ということです。
IO.SYSがOSとハードウェアの仲立ちをしてデータの入出力(Input/Output=I/O)を制御してくれます。要するにIO.SYSがあれば基本的なデバイスは最低限の機能をつかえるようになるのです。
MSDOS.SYSファイルがMS-DOSの本体と言える機能を果たします。UIとIO.SYSを仲介するOSの本体ファイルです。ファイル/メモリ/デバイスを実際に管理しています。
で。COMMAND.COMはユーザから受け取った命令をMSDOS.SYSに引き渡すことで、様々な実行をOS本体に依頼して結果を画面に出力します。
 <人間>---<COMMAND.COM>---<MSDOS.SYS>---<IO.SYS>---<ハードウェア>
と、このような流れで処理を出して処理の結果を人間に報告するのがDOSというOSになります。いまでは考えられないほど軽量ですね。

これに加えて、config.sysとautoexec.batという二つの設定ファイルを加えた合計5ファイルが最低限のOS動作を構成する要素です。
config.sysが使用する周辺機器やソフト用の環境を整えてDOSの基本的な動作環境を設定するファイルで、autoexec.batがOS起動時に毎回起動するファイルを実行させる(Windowsのスタートアップのような機能の)ファイルです。
特にconfig.sysに情熱を傾ける人はこの時代では必ず身近にいましたね。「俺のconfig.sysスゲーだろ?」みたいな。

32ビットWindows7ではc:\にIO.SYSとMSDOS.SYS(加えてconfig.sysとautoexec.bat)が存在していてc:\Windows\system32配下にCOMMAND.COMファイルの存在が確認できます。おそらく利用されているわけではないけども何かの下位互換のためにファイルだけは存在しているんだと思います。64ビットWindowsではこのファイルは存在しません。

f:id:treedown:20160301101149p:plain

ざっくりした言い方をしますとWindowsはこの5つのファイルが複数になり規模が巨大化したOS、という言い方もできます。20年くらい前には上記のようなOSが主流だったことを考えると技術の進歩って目覚ましいものですね。