なぜDOSでは copy con ファイル名 なのか

unixで cat > foo.txt ってやっている感覚からすると、
DOSの場合なら、type > foo.txt とするのが自然な気がするのになんでやらないんだろう?と思ったので。

これはすぐに解決。

C:\> type > foo.txt
コマンドの構文が誤っています。
C:\>type /?
テキスト ファイルまたはファイルの内容を表示します。
TYPE  [ドライブ:][パス]ファイル名
C:\> type con > foo.txt
bar
^Z

そもそもtypeコマンドでは、引数のファイル名は省略できない。
つまりcatコマンドのように、引数を省略すると標準入力を使用する、という機能がなかった。
なので、ファイル名として明示的にconを与えてやると動く。

こうなると次の疑問がわく。

なぜtypeコマンドではなくcopyコマンドなのか

「COPY FILE AUX」で送信されたテキストファイルを「COPY AUX FILE」で
受信するためには、ファイルの末尾に^Z=$1Aが付いている必要があります。
これは$1Aがないと受信側のCOPYコマンドが終了しないからです。
(「TYPE FILE > AUX」で送信すると$1Aが欠落するのでうまくいきません)

^Z は MS-DOS よりも昔の DOS である CP/M で、ファイルの終わりを示し
ていたのですが、今の OS では必要ありません。

http://www.geocities.jp/m_hiroi/gbook1.html

念のため実際に、type con > type.txt と copy con copy.txt をやってみたが、
どっちのファイルにも^Zは入ってなかった。(WindowsXPにおいて)
今となってはどっちでもいいけど、歴史的経緯によりcopyを使う方の作法が
慣例になったってところなのかな。

あるいは、どうせconが省略できないならcopyを使う方がタイプ数が少ないから、とか。