最低限の MS-DOS

-- 目次 --

  1. 前書き
  2. MS-DOS の用語
  3. MS-DOS のコマンド
  4. シェル (shell)
  5. 標準入出力

1. 前書き

今日では MS-DOS のみを使う必要性はほとんどないが、 時には Microsoft Windows の DOS 窓を使う必要性もあり、 また DOS 窓から、コマンドを打ち込むほうが手っとり早い こともあるので、簡単に MS-DOS の説明をする。

UNIX との比較もすることになるが、 この場合はコンソールでの UNIX と思ってもらってもよいし、 DOS 窓と見かけが随分似ている XWindow の (kterm などの) 仮想端末からの UNIX のコマンド入力との比較であると思ってもらってもよい。

2. MS-DOS の用語

ごく基本的な用語の説明をする。 Windows ではファイル名に大文字、小文字を使うことができるが、 両者を区別しない。 MS-DOS のコマンドも原則的に大文字と小文字の区別をすることはないが、 以下 UNIX と比較するためにも、MS-DOS のコマンドを 小文字で表記する。 (UNIX では大文字、小文字を厳密に区別するが、 システムコマンドは通常小文字である。)

プロンプトとコマンドライン

MS-DOS や UNIX などで、コマンドをキーボードから 入力できる状態のときに端末などに表示されるマークを プロンプトという。たとえば (UNIX ではシェルによってプロンプトの形が変化して)

 >  MS-DOS
% UNIX (csh)
# UNIX (bash)

プロンプトの直後にコマンド (命令) を入力することができ、 この行のことをコマンドラインという。 なおコマンドを計算機に与えるためには最終的にリターンキー (あるいはエンターキー) を押す必要がある。

ドライブ名

Windows (MS-DOS) では接続されている ハードディスク装置、フロッピーディスク装置、CD-ROM 装置などには 必ずドライブ名 (a から z) が付けられる。 例えば

となっており、異なる装置には異なるドライブ名が割り当てられている。 コマンドラインから


d:

のように打ち込めば、ドライブ d に移動する。

UNIX にはドライブがない。UNIX では複数のハードディスクなどが 接続されている場合にも、見かけ上、一つのハードディスク (より正確には唯一つのファイルシステム) があるだけである。 このファイルシステムは UNIX をインストールする時点で決まり、 あとでハードディスクを増設することが不可能である。 増設するためには最初からインストールをやりなおさなければならない。 これが Windows と違う点である。

ディレクトリー (or フォルダー)

各ドライブにはディレクトリー (or フォルダー) と呼ばれるものを 作って、ファイルを分類整理できる。 例えば

ディレクトリーの作成例
d:\
  |-- archiver
  |          |-- work
  |
  |-- work
  |-- usr 
        |--local
        |--bin
        |--mule2
        |--share

のような構造を持つ。上の例では d ドライブ全体が一つの ディレクトリーで、その中に幾つかのディレクトリーがあり、 更に各ディレクトリーの中に幾つかのディレクトリーがある (あるいは作ることができる)。 階層が一番上のディレクトリーをルートディレクトリー と呼び \ で表示する。

ディレクトリーと呼ぶのは MS-DOS や UNIX の方式で、 MS-Windows ではフォルダーと呼ぶ。 ファイルを整理するための階層構造という点からは、 フォルダーと呼ぶ方がすっきりするかもしれない。

先にも説明したように UNIX ではドライブがなく。 ファイルシステムは唯一つである。 そのためルートディレクトリーは唯一つしかない。UNIX では ルートディレクトリーを / で表記する。 (円記号 \ は UNIX では常に逆スラッシュ\になるが、MS-DOS の ディレクトリー表示の \ は UNIX ではスラッシュ / である。)

ディレクトリーの絶対指定と相対指定

下の例では d:\work は赤で表示したディレクトリーで、 d:\usr\local は黄色で表示したディレクトリーである。

このようにディレクトリーを表示する方法をディレクトリーの 絶対指定という。

d:\
  |-- archiver
  |          |-- work
  |
  |-- work
  |-- usr 
        |--local
        |--bin
        |--mule2
        |--share

ディレクトリー構造が上のようになっているときに d:\archiver において

 \work  赤のディレクトリー
 work   緑のディレクトリー

となる。すなわち先頭に \ などを付けずに、 ディレクトリー指定をすれば、 それより下位のディレクトリーを指定することになる。 これをディレクトリーの相対指定という。 ディレクトリーの相対指定にはこれ以外に

 .   現在のディレクトリー(カレントディレクトリー)
 ..  現在のディレクトリーの一つ上のディレクトリー

がある。 カレントディレクトリー (current directory) は DOS 窓ごとに 決まる。DOS 窓は何個も開くことができて、 この各々の窓ごとに現在のドライブ、ディレクトリーが 定まってくる。従って Windows ではシステム全体のカレントディレクトリーは 定まらない。UNIX においても同様である。

また UNIX でのディレクトリーの絶対表記は例えば /usr/local のようになる。

環境変数

普通、変数はプログラム内部で有効なだけであるが、 環境変数と呼ばれる変数はシステムで有効な変数で、 すべてのプログラムから参照することができる。 これは任意に設定できるが、 普通のプログラムと同様に役目の決まった予約変数がある。 例えば、環境変数 PATH はコマンドを探すときのディレクトリーの リストを示す。 例えば、


SET PATH=C:\WINDOWS;C:\WINDOWS\COMMAND

とすれば、コマンドを c:\windows, c:\windows\commannd の 2 つのディレクトリーを探すことになる。 以上の設定はコマンドラインから打ち込んでもよいが、 普通は c:\autoexec.bat に書き込むのが普通である。

どのようにして、 コマンドラインのパラメータや環境変数が読み取られているかを 知っている方がコマンドの動作の仕組を理解しやすいことがあるので、 参考までに以上の変数を獲得する C 言語サンプルをつける。 (UNIX 上の C 言語は原則的に英語版であるため、 以下のプログラムを UNIX で動かすためには 日本語を英語にしたほうがよい。)

C プログラムからパラメータ、環境変数を獲得するサンプル

#include <stdio.h>
#include <stdlib.h>

void main(int argc, char *argv[]){
    printf("コマンドラインから手渡された文字列の数は %d です。\n", argc);
    printf("コマンドラインから手渡された最初の文字列は %s です。\n", argv[1]);
    printf("環境変数 PATH の値は %s です。\n", getenv("PATH"));

}

3. MS-DOS のコマンド

コマンド意味対応する UNIX コマンド
mkdirディレクトリー作成 (make directory) mkdir
cdディレクトリー移動 (change directory) cd
copyファイルのコピー (copy) cp
dir ファイル名の一覧 (directory)ls

以下に、より詳しく説明します。

mkdir


mkdir ディレクトリー名

でディレクトリーを作成します。以下の 2 つの 使用方法では違って結果が起きることに注意します。

  mkdir work 現在いるディレクトリーの下に work を作る (相対指定)
  mkdir \work 現在いるドライブのルートディレクトリーの下に work を作る (絶対指定)

下の図の d:\archiver にいるときには、 第 1 の方法でできるディレクトリーが緑色、 第 2 の方法でできるディレクトリーが赤色です。

d:\
  |-- archiver
  |          |-- work
  |
  |-- work

cd


cd ディレクトリー名

でディレクトリーを移動します。 以下の 2 つの 使用方法では違って結果が起きることに注意します。

  cd work 現在いるディレクトリーの下の work に移動 (相対指定)
  cd \work 現在いるドライブのルートディレクトリーの下の work に移動 (絶対指定)

下の図の d:\archiver にいるときには、 第 1 の方法による移動先ディレクトリーが緑色、 第 2 の方法による移動先ディレクトリーが赤色です。

d:\
  |-- archiver
  |          |-- work
  |
  |-- work

copy


copy A B

の構文で、 原則的にファイル A をファイル B にコピーしますが、

B がディレクトリーのとき、


copy *.txt B

によって、現在のディレクトリーにあるファイルで、 拡張子が .txt であるファイルがすべて B にコピーされます。 * は任意の文字列を意味し、 トランプのワイルドカード (どのカードにも一致するカード) の意味で使用されます。 UNIX のコピーコマンドは cp で、 名称が少し違いますが、tcsh などでは * は同様な意味を持っています。

dir


dir

で現在いるディレクトリーのファイル名の一覧を表示します。 対応する UNIX のコマンドは ls です。

4. シェル (shell)

MS-DOS ではコマンドを解釈するプログラム (command.com) によってコマンドが処理されていました。 Windows NT では command.com 自身が動いているのではなく、 これをエミュレート (emulate, 真似) する cmd.exe によって、 コマンドが処理されます。

UNIX ではコマンドを解釈するプログラムはシェル(shell) と呼ばれ、そのため Windows の cmd.execommand.com のことを一般的に シェルと呼ぶ傾向があります。このように呼ばれる理由の一つに、 現在では UNIX シェルを DOS 窓で使用できるようになったこともあります。 つまり cmd.exe, command.com は Windows の DOS 窓で動かすことができる シェルの一つに過ぎないわけです。

バッチファイル (シェルスクリプト)

常に同じ一連のコマンドをコマンドラインから打ち込む必要がある場合には、 普通はファイルに一連のコマンドを書いておいて、 このファイルを実行させるのが普通です。 このようなファイルは MS-DOS では拡張子に .bat が付いていて バッチファイル と呼ばれます。 UNIX では同様なファイルはシェルスクリプト ( shell script) と呼ばれ、 MS-DOS のバッチファイルのこともシェルスクリプトと 呼ばれることがあります (UNIX ではシェルスクリプトには特別な 拡張子は付きません)。

UNIX のシェルスクリプトには if 文などの条件文を使うことが でき、一方 MS-DOS のバッチファイルにはこのような機能が ほとんどありませんから、バッチファイルのことをシェルスクリプト と呼ぶことは少し分不相応な面があります。

autoexec.bat

autoexec.bat は MS-DOS が起動時に実行するバッチファイルです。 ここでは普通、環境変数を設定します。 例えば

autoexec.bat の例

SET PATH=%PATH%;d:\archiver;d:\usr\local\bin

のようにします。環境変数 PATH の値 (これは文字列です) を バッチファイル内で使用する場合には %PATH% とします。 従って上の autoexec.bat の意味はすでに値が設定されている 環境変数 PATH の値 (文字列) の後ろに ;d:\archiver;d:\usr\local\bin を付け加える ものです。

UNIX にも同様なファイルがあります。 シェルによって違いますが、csh (C シェル) を使用している場合には、 .cshrc が autoexec.bat と同じ役目を果たします。 例えばコマンド検索パスの設定は次のようになります。

.cshrc のサンプル (一部分)

set path = (. /usr/local/bin /usr/lib /users/bin $path)

$path は autoexec.bat の %PATH% と同じ役目をします。

色々なシェル

UNIX のシェルで Windows に移植されているものに、 次があります。

 sh  角藤版 pLaTeX に同梱
 bash  Cygnus GNU-Win32
 tcsh  Virtually UN*X!

Cygnus GNU-Win32 $B$K4X$7$F$O

奥村晴彦, LaTeX2e 美文書作成入門, 技術評論社
に説明があります。

mule for Win32 が Windows 95 の command.com で動作が不安定の場合には、 bash, tcsh を使用した方がよいようです。 設定方法などは

mule for Win32 の FAQ
を参照してください。

5. 標準入出力

標準入出力の考えは C 言語をある程度知っていないといけません。 ここでは標準入出力の考えを C 言語のサンプルプログラムで説明します。 標準入出力の考えは DOS でも UNIX でも変りません。

リダイレクト

次のようなプログラムを考えます。

sample.c

#include <stdio.h>

void main(){
    int i;
    scanf("%d", &i);
    printf("%d\n", 2*i);
}

中身は単に数値を入力して、2 倍して出力するだけのものです。 この場合の scanf は実は標準入力から入力する命令で、 printf は標準出力に出力する命令です。通常は標準入力はキーボードで、 標準出力はディスプレーになっていますが、 これをファイルなどに切り替えることができます。 例えば中身が次のようなファイル

test.dat

15

を用意して、コマンドラインから


sample <test.dat

のようにすれば、入力が test.dat に切り替わり、30 がディスプレーに 表示されます。出力に関しても同様で


sample <test.dat >result.dat

とすれば、ファイル test.dat から入力され、 ファイル result.dat に出力されます。 以上の方法を入出力のリダイレクト (redirect = 向きを変えること) といいます。一般にプログラムで入出力がリダイレクトできるかどうかは、 プログラムの書き方で決まってきます。

パイプライン

今 2 つのプログラム A, B があって、


A | B

のようにコマンドラインに打ち込むと, A の標準出力が B の標準入力と なります。このときの縦棒は A の標準出力を B の標準入力に 流し込むためのパイプあるいはパイプラインと呼ばれます。 標準入出力の時のサンプルを使用すれば


sample <test.dat | sample

とすれば、ディスプレーに 60 が表示される。

以上、パイプラインは DOS でも UNIX でも使用することができますが、 違いがあります。DOS のパイプラインは ディスク上の一時ファイルを経由するようです。 従って A | B の構文では事実上 A の処理が終了するまで、 B の処理が始まりません。 これに反して UNIX ではオンメモリーで処理をし、 A | B の構文では A, B が連結した状態で動きます。 そのため場合によっては UNIX の方が圧倒的に速さを見せることになります。