-- 目次 -- |
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) が付けられる。 例えば
となっており、異なる装置には異なるドライブ名が割り当てられている。 コマンドラインから
a
フロッピーディスク装置c
Windows のシステムがあるハードディスク
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 つの 使用方法では違って結果が起きることに注意します。
|
下の図の d:\archiver にいるときには、 第 1 の方法でできるディレクトリーが緑色、 第 2 の方法でできるディレクトリーが赤色です。
d:\ |-- archiver | |-- work | |-- work |
cd
|
cd ディレクトリー名 |
でディレクトリーを移動します。 以下の 2 つの 使用方法では違って結果が起きることに注意します。
|
下の図の d:\archiver にいるときには、 第 1 の方法による移動先ディレクトリーが緑色、 第 2 の方法による移動先ディレクトリーが赤色です。
d:\ |-- archiver | |-- work | |-- work |
copy
|
copy A B |
の構文で、 原則的にファイル A をファイル 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.exe
や command.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 の方が圧倒的に速さを見せることになります。