====================================================== 2000.03.14 ======
Windows 95/98 管理人のための MS-DOS 基礎講座
------------------------------------------------------------------------
第 4 回 リダイレクト・パイプとデバイスファイルの話
========================================================================
こんにちは。でるもんた・いいじまです。
おかげさまで読者数が 5000 名様をこえました。いままで、MS-DOS を
正面から扱ったサイト等はなかったので、それなりの数になるだろうとは
予想はしていたのですが、まさかこんなに多くなるとは思いませんでした。
これからもどうぞよろしくお願いします。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆本日のお題☆
今回は「リダイレクト・パイプとデバイスファイルの話」です。
この「リダイレクト」「パイプ」という概念は、GUI にはない非常に
重要な概念で、いちどおぼえると非常に便利です。いちおう本講座は
Windows 95/98 が主対象ですが、Windows NT/2000 でも使えますので、
ぜひおぼえて使ってみて下さい。
なお、リダイレクト・パイプは比較的高度な話題ですので、難しければ
読み飛ばしてしまってもかまいません。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆予備知識☆
このマガヂンでは、Windows の操作・管理についてある程度の予備知識が
あることを前提に話を進めています。今回の記事では、次の概念はすでに
知っているものとして話を進めさせていただきますのでご了承ください。
○ファイル・ディレクトリとは
○テキスト(.txt)ファイル
また、前回までに説明した次の概念も重要ですので、曖昧なところがある
場合はしっかり復習しておいてください。
○dir コマンド(第 1 回)
○ワイルドカード(第 1 回)
○カレントディレクトリ・カレントドライブとは(第 2 回)
○type/more/del コマンド(第 3 回)
なお、前回までは、コマンドの後にリターンキーを入力することを示す
ために、【リターンキー】とことわっていましたが、読者のみなさまは
もうおわかりだと思いますので、今回からは省略させていただきたいと
思います。つまり、特に断り書きがない限り、コマンドを打ち込んだら
リターンキーを押すようにしてください。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆リダイレクトって?☆
それでは今回のテーマ、「リダイレクト」です。これは、簡単に言って
しまうと、
○画面に表示されるはずのものを、別のファイルに記録する
○キーボードから入力するかわりに、別のファイルから入力する
というものです。
【余談】英語では動詞形が redirect、名詞形が redirection ですので、
「リダイレクション」が正しいはずなのですが、どうも私は動詞
形の「リダイレクト」を名詞としても使う癖がついてしまってい
るので、それで統一させてください。
◇出力のリダイレクト (1) '>' を使う
まずは今までの復習ですが、
C:\Windows> dir
と打ち込んだら、カレントディレクトリのファイル一覧が出てきました。
ここで、
C:\Windows> dir > dir.txt
と打ち込んでみてください。「C:\Windows>」の部分はすでに表示されて
いるプロンプトですから、実際に打ち込むのは「dir > dir.txt」の部分
ですね(> の記号が 2 箇所にあって紛らわしいですがご注意ください)。
この場合、何も画面には出てこないと思います。そこで、「メモ帳」を
使って、さっきの dir.txt を開いてみて下さい。もちろん、前回説明した
type コマンドを使って、
C:\Windows> type dir.txt
としてもかまいません。そうすると、dir コマンドで画面に出てくるはず
だったものが、このファイルに記録されていることがわかります。
【余談】DOS 画面から「メモ帳」を起動することもできます。これには、
C:\Windows> notepad dir.txt
とします。あるいは、拡張子 .txt に関連づけられたアプリ
(通常は「メモ帳」ですが、他のエディタ等をインストールして
いればそれになりますよね)で dir.txt を開くには、
C:\Windows> start dir.txt
とします。詳しくは次回以降で解説します。
この、「> ファイル名」という書き方は、dir 以外にもほとんどのコマン
ドで使用可能です。たとえば、前回説明した copy コマンドでは、
C:\My Documents> copy report1.doc a: > copy-log.txt
とすると、コピーの経過報告が、画面ではなく
C:\My Docuemnts\copy-log.txt に保存されます。
◇出力のリダイレクト (2) '>>' を使う
さて、「> ファイル名」では、新しくファイルを作って、それに出力結果を
書き込みます。いっぽう、既存のファイルの末尾に追加するということも
できます。たとえば、
C:\Windows> dir >> dir.txt
とすると(> の記号がふたつ並んでいることに注意)、既存の dir.txt の
末尾に、dir コマンドの出力が付け足されます。
【補足】dir.txt が存在していないときは、'>' の時と同じく、新しく
作られます。
☆
この '>>' が便利な例をひとつあげておきます。
dir コマンドに /s(subdirectory の略?)というオプションをつけると、
指定されたディレクトリの下の全ディレクトリのファイル一覧を表示して
くれます。たとえば、
C:\My Documents> dir \ /s
とすると、カレントドライブ(C ドライブ)の全ファイルを表示してく
れます。バックアップの際にファイル一覧を保存しておけば、消してし
まったファイルをあとで復旧するときなどに便利です。このとき、
C:\My Documents> dir \ /s > dir-2000-Mar-14.txt
とすることができますね。
では、バックアップ対象が C ドライブだけではなかった、つまり、たと
えば D ドライブ・E ドライブのファイル一覧も同時にとっておきたい場合
はどうでしょうか。別々のファイルに保存して後から圧縮するなどの方法も
ありますが、次のようにすることもできます。
C:\My Documents> dir \ /s > dir-2000-Mar-14.txt
C:\My Documents> dir d:\ /s >> dir-2000-Mar-14.txt
C:\My Documents> dir e:\ /s >> dir-2000-Mar-14.txt
【補足】この dir /s では、「隠しファイル」「システムファイル」
とよばれるファイルは表示されませんので、バックアップの
目的に使う場合は、/s に加えて /a というオプションをつ
ける必要があります。詳しくは後日説明します。
◇入力のリダイレクト - '<' を使う
さて、'>' や '>>' を使うと、画面に表示されるはずの内容がファイルに
記録されます。逆に、'<' という記号を使って、「キーボードから入力
するかわりに、ファイルから入力する」ということができます。こちらは、
今回ご紹介する範囲ではあまり役に立たないのですが、次に説明する
「パイプライン」という形で、あるいは次回第 5 回に説明する「バッチ
ファイル」という形で利用すると便利なものです。
たとえば、
C:\Windows> time
とすると、コンピュータに設定されている現在時刻が表示され、そのあと
に、時刻の入力を求められます。ここで単にリターンキーを押すと、時刻
の変更は行われません。
ここで、「00:00」とだけ書いて改行を入れただけのテキストファイル
(仮に midnight.txt とします)をあらかじめ用意しておいて、
C:\Windows> time < midnight.txt
とすると、キー入力のかわりに midnight.txt の内容が読まれ、現在時刻
が 00:00 に設定されます。あるいは、単に改行をひとつ入れただけのテキ
ストファイル(仮に return.txt とします)を用意しておいて、
C:\Windows> time < return.txt
とすると、単に現在時刻が表示されたあと、キー入力を待つことなくプロ
ンプトに戻ります。
あるいは、del コマンドで削除対象のファイルに「*.*」(=すべてのファ
イル)を指定すると、本当に消してよいかどうかを聞いてきます。消して
よければ y を、それでは困る場合は n をキー入力するわけですが、
「y【改行】」とだけ書いたテキストファイルを用意し、これを '<' で
del コマンドに与えてやると、コマンドを入力した瞬間にファイルが削除
されます。
【注意】これらのコマンドに中身が空のファイルを与えたり、2 行以上の
入力を要求するコマンド(たとえば、後日紹介する format コマ
ンド)に対し、行数の足りない入力ファイルを '<' で与えたり
すると、ハングアップします(正確にいうと、来るはずのない
ものを永遠に待ち続ける状態になります)のでご注意ください。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆デバイスファイル☆
◇デバイスファイルに出力する
さて、リダイレクトの対象は、なにも普通のディスク上のファイルだけ
とは限りません。「プリンタに出力する」「出力結果はどこにも出さず、
捨てる」ということも可能です。
たとえば、
C:\Windows> dir > prn
のように、prn というファイルにリダイレクトすると、環境によっては、
dir コマンドの出力がプリンタに出力されます。
【注意】これができない(プリンタに出力されない)環境もありますし、
できても日本語が文字化けする場合もありますので、うまくい
かなくても気にしないでください。これは、お使いのプリンタが、
印刷したい内容を書いたテキストファイルではなく、特別な形式の
データを要求する場合、あるいは、半角英数字のテキストは受け
つけても日本語の取り扱い方が通常のテキストファイルの場合と
は違う場合に起こります。詳しくは後日また説明したいと思います。
なお、いずれにしても、カレントディレクトリに prn というファ
イルが作られることだけはありません。
あるいは、前回説明した copy コマンドでは、どのファイルをコピーした
のかが画面に出力されますが、ファイルが多すぎてスクロールしていまい、
ひとつ前までのコマンドの結果が見られなくなってしまう場合があります。
この場合は、
C:\My Documents> copy *.* a: > nul
のように nul というファイルにリダイレクトすると、その結果をいっさい
表示せず、黙ってコピーしてくれます。
【補足】このとき、nul のかわりに適当な名前を指定すると、ディスク上
にその名前のファイルが作られますが、nul を指定するとディスク
上にはファイルは作られません。
◇じゃあ、prn というファイルはどうやって作る?
この
dir > prn
copy *.* a: > nul
というコマンドは、字面どおりに読めば、「カレントディレクトリの
prn または nul というファイルにリダイレクトする」という意味に
なります。が、これらは実際にはプリンタへの出力だったり、どこにも
出さないという意味だったりします。
では、prn(または nul)という名前のディスクファイルにリダイレクト
したいときはどうすればいいのでしょうか? 結論からいえば、
prn、nul という名前のディスクファイルを作ることはできない
のです。MS-DOS 上のソフトでは、どんなソフトであっても、prn という
ファイルに書き込もうとすると、ディスクファイルができるかわりにプリ
ンタにデータが送られますし、nul というファイルに書き込もうとすると、
どこにも書き込まれずに終わります。
いちど、Windows 上のアプリ(たとえば「メモ帳」「ワードパッド」など)
でも、prn、あるいは nul という名前のファイルを作ろうとしてみてくだ
さい。Windows 上のアプリでもできないはずです。
このような、prn、nul といった特殊なファイルのことを、デバイスファ
イルといいます。
【補足】ちなみに、prn はもちろん printer の略、nul は null(無)
の略です。
◇con デバイスファイル
では、「キーボード」や「画面」を表すファイル名はあるのでしょうか。
結論からいえば、「con」というファイルがそうです。con というファイル
から読み込むとキーボードから、con というファイルに書き込むと画面へ
という意味になります。
【余談】この con は console の略です。Console というのは、一昔前の
SF 映画に出てくるような、大きな画面とキーボードが一体に
なった装置のことをいうようです。
たとえば、テキストエディタを起動するのが面倒なとき(あるいはテキスト
エディタが何もないとき)には、
C:\My Documents> copy con nantoka.txt
と入力してテキストファイルを作ることができます。
【補足】このとき、「キー入力はこれでおしまい」ということを示すに
は、Control+Z を押して(^Z と表示されます)リターンキーを
押します。
また、前回説明した type コマンドではワイルドカードが使えませんで
したが、
C:\My Documents> copy *.txt con
とすればほぼ同等のことができます。
【補足】copy コマンドは、「コピー元」が複数のファイルで、「コピー
先」がひとつのファイルだと、コピー元のファイルを全部つな
げたものをコピー先ファイルに書き込みます。
◇余談: concon バグ
さいきん巷で話題になっているものに、「concon バグ」というものが
あります。これは、Windows 95/98(2000/NT は問題ない)で、
C:\Windows> cd con\con
C:\Windows> cd nul\prn
のように、ディレクトリ名に con などの特殊ファイル(デバイスファイ
ル)を使うと Windows がハングアップしてしまうことがあるというもの
です。
自分一人で使うぶんには、そういうファイル名にアクセスしなければいい
だけのことなのですが、たとえば web ページ中に
<img src="file:c:\con\con\con.gif">
などと書かれていたら、そのページを開いた瞬間にハングアップしてし
まいますし、Windows 95/98 で web サーバーを動かしているようなとこ
ろでは、誰かが http://ホスト名/con/con/con という URL にアクセス
するだけでサーバーが停止してしまいます。
すでに対応策はありますので、Windows 95/98 をご利用の方は
http://www.oct.zaq.ne.jp/yufu/browser/2000/02.html#26_03
を読まれることを強くおすすめします。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆標準入出力とは☆
ここで、ちょっと抽象的になりますが、「標準入出力」という概念を
説明します。リダイレクトや、次に説明する「パイプ」を利用するコマ
ンドの説明では必ず出てくる重要単語ですので、覚えておいてください。
◇標準入力・標準出力
実は、'>'、'>>'、'<' で入出力をリダイレクトできる各コマンドは、
中で「キーボードから入力する」「画面に出力する」という設計にはなっ
ていません。そのかわり、
MS-DOS が用意する「標準入力装置(standard input device)」
からの入力を受け取り、「標準出力装置(standard output
device)」に出力する
という設計になっています。各コマンドは、標準入力・出力装置が何で
あるかは OS にいっさいお任せで、コマンドの側で基本的には関知しま
せん。
標準入力・出力装置は、特に何も指定しなければキーボードと画面になっ
ていますので、特に指定しなければ「キーボードから入力を受け取り、
画面に結果を吐き出すコマンド」に見えます。しかし、'>'、'>>'、'<'
を使うと、標準入力・標準出力をキーボード・画面以外のファイルにする
ことができます。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆リダイレクトできない場合もある☆
さて、実は、'>' や '>>'、'<' ではリダイレクトできないという場合が
あります。
◇コンソール決め打ちの場合
たとえば、
C:\My Documents> copy *.txt con > copy.txt
とやっても、*.txt の内容は相変わらず画面に表示されます。これは、
コピー先を「標準出力に」ではなく、con つまり「画面に」と指定して
しまっているからです。
【余談】とはいえ、このリダイレクトに全く意味がないわけではありま
せん。実際にやってみて、copy.txt に何が書き込まれたかを
調べてみてください。これをふまえた上で、
C:\My Documents> copy *.txt con > nul
と入力するのは非常に便利です。
前回、「コマンド名 | more」で 1 画面ずつ表示することができると説明
しましたが、これは実はリダイレクトの機能を利用したものなので(詳し
くは次項で説明します)、
C:\My Documents> copy *.txt con | more
としても意味がありません。
また、ワープロなどのソフトでは、リダイレクトはできません。これも、
そのソフトの中に、「標準入力装置から」ではなく「キーボードから」
入力を受ける、「画面に」出力するというコードが書かれているからです。
◇標準エラー出力に出す場合
もう一つの可能性は、それぞれのコマンドが「標準エラー出力装置」と
いう場所に出力している場合です。これは、
○エラーメッセージは標準出力とは別の場所に出したい
○しかし、画面に限定する必要はないので、こちらは
標準出力とは別の方法でリダイレクトしてもよい
という意図がある場合に使うものですが、MS-DOS では標準エラー出力の
リダイレクトには面倒な作業と簡単なプログラミングの知識が必要なので、
結果として必ず画面に出力されてしまうことになります。
たとえば、dir コマンドに出鱈目なオプション、たとえば /x をつけると、
その旨のエラーメッセージが表示されます。
C:Windows> dir /x
無効なスイッチです. - /X
このエラーメッセージは標準出力ではなく標準エラー出力に出力されて
いるので、'>' ではリダイレクトできません。
C:Windows> dir /x > nul
無効なスイッチです. - /X
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆パイプライン☆
次にご紹介するのが、リダイレクトの応用、「パイプライン」です。
◇sort コマンド (1) ファイルから読む
MS-DOS に、sort というコマンドがあります。テキストファイルの中身を
ABC 順にソートするコマンドです。たとえば、
-----------この下の行から------------
www-admin@sodan.ecc.u-tokyo.ac.jp
L94102@mail.ecc.u-tokyo.ac.jp
mag2from@mag2.com
hidesoft.2@maruo.co.jp
-----------この上の行まで------------
という内容のテキストファイル(仮に mail-address.txt)があったとして、
C:\My Documents> sort mail-address.txt
とすると、ABC 順に並べ替えられて
hidesoft.2@maruo.co.jp
L94102@mail.ecc.u-tokyo.ac.jp
mag2from@mag2.com
www-admin@sodan.ecc.u-tokyo.ac.jp
と表示されます。この結果は標準出力に出力されますので、
C:\My Documents> sort mail-address.txt > sorted.txt
といった形でリダイレクトすることができます。
◇sort コマンド (1) ファイルから読む
じつは、この sort コマンドは、引数にファイル名を指定しなければ、
標準入力から読むという設計になっています。ですから、
C:\My Documents> sort < mail-address.txt > sorted.txt
とすることもできますし、あるいは、
C:\My Documents> sort > sorted.txt
とだけ入力して、キーボードから入力する(Windows 上で動かしている
場合は、クリップボードからの切り貼りも可能ですね)ということも
できます。
◇dir コマンドの出力結果をソートする
次は、コマンドの出力結果をソートしたい、という場合を考えます。
この場合、リダイレクトを使って
C:\My Documents> dir > dir.txt ←ファイル一覧を得る
C:\My Documents> sort < dir.txt > sort.txt ←ソートする
C:\My Documents> del dir.txt ←もう要らないファイルを削除
とすることができますが、実は、
C:\My Documents> dir | sort > sort.txt
とすると、MS-DOS が上の作業を自動的に行ってくれます。この機能を
「パイプライン」といいます。
【補足】ただし、dir コマンドの出力を記録するファイル名は、MS-DOS が
勝手に決めます。通常は C:\Windows\temp\ABCDEFGH といった
名前になるようです。
実は、sort コマンドが標準入力からの入力を受け付けるのは、
このようなパイプラインでの利用を想定したものなのです。
◇パイプラインの一般形
一般に、
C:\Windows> コマンドその壱 | コマンドその弐
というコマンドを入力すると、自動的に
C:\Windows> コマンドその壱 > 適当なファイル
C:\Windows> コマンドその弐 < 上と同じファイル
C:\Windows> del 上と同じファイル
を実行してくれます。あるいは、3 段以上のパイプライン
C:\Windows> コマンドその壱 | コマンドその弐 | コマンドその参
も利用可能です。
◇ひとつの応用例 - echo を使う
echo というコマンドは、引数をそのまま標準出力に表示します。たとえば、
「echo hello, everyone!」と入力すると、画面(標準出力)に「hello,
everyone!」と表示します。
この echo コマンドを使って、
C:\My Documents> echo (1) redirection > resume.txt
C:\My Documents> echo (2) con, prn, nul, concon >> resume.txt
C:\My Documents> echo (3) stderr >> resume.txt
C:\My Documents> echo (4) pipe >> resume.txt
のようにして、エディタなしでテキストファイルを作ることができますし、
あるいは、
C:\My Documents> echo y | del *.*
とすると、無条件でファイルが削除されますし、
C:\My Documents> echo 00:00 | time
は
C:\My Documents> time 00:00
と同じように現在時刻を 00:00 に設定します。
◇more の正体
さて、ここで、第 3 回までに出てきた more コマンドについて見てみ
ましょう。more コマンドは、次のような形で利用可能でした。
C:\My Documents> more report.txt
C:\My Documents> more < report.txt
C:\My Documents> dir | more
これをよく見てみると、2 番目・3 番目の方法は、リダイレクト・パイプを
使って標準入力を読むものであることがわかります。
第 1 回で、「dir | more は dir /p より遅い」という趣旨の説明をしま
したが、これは、
○dir /p では、ディレクトリの中身を調べて、わかった情報が
その時点ですぐ表示される
○dir | more では、いったん dir の出力をすべてファイルに
保存してから、その結果を more で表示するので、dir コマン
ドが終了するまで表示が行われない
ということです。したがって、dir /s のように時間がかかる場合には、
dir /p のほうが dir | more より有利ということになります。
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆UNIX がわかる人のために☆
'>'、'>>'、'<' はもちろん UNIX と同じです。ただし、'>&'、'2>'、
'|&' といったものは使えません。
デバイスファイルは、UNIX では /dev/ という特定のディレクトリに
なければデバイスファイルとは見なされませんが、MS-DOS では、存在
するディレクトリならどこにあっても con はコンソールという意味に
なります。
【余談】MS-DOS では、\dev というディレクトリがなくても、\dev\nul
や \dev\con と書けることになっています。これは UNIX の
影響を受けたものであるということがいえます。
'|' は、UNIX では二つのコマンドを並列に実行しますが、MS-DOS では、
前のコマンドが終了してから次のコマンドを実行します(これは、Windows
で並列処理が可能になった今でも変わっていません)。
ですから、UNIX の「yes|rm」のような使い方はできません。MS-DOS 用の
yes コマンドを作ってこのようなパイプラインを実行すると、ディスクが
いっぱいになるまで無駄なファイルが作られることになります。
=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆まとめ - 本日のキーポイント☆
今回は、非常にわかりにくかったかもしれません。今回の内容は、
「わかっていれば便利」というだけで、わからなくてもそんなに重大な
不都合があるわけではありませんので、わからなければそのまま気に
しないでください。
◇重要ポイント
○コマンド>ファイル名、コマンド>>ファイル名、コマンド<ファイル名
○デバイスファイル、>prn、>nul、copy con、concon
○コマンド|別のコマンド
○sort、echo
◇発展編
○標準入出力とは
○リダイレクトができない場合…決め打ちの場合と標準エラー出力の場合
=-=-=-=-=-=-=-==-=-=-=-=-=-=-=--=-=-=-=-=-=-=-==-=-=-=-=-=-=-=-=-=-=-=-=-
☆次回予告☆
次回は「第 5 回 バッチファイルの話」と題して、コマンドライン系
OS の醍醐味のひとつである「定型処理の半自動化」のための手段、
バッチファイルの説明をしたいと思います。
それではまた♪
========================================================================
メエルマガヂン Windows 95/98 管理人のための MS-DOS 基礎講座
☆発行人☆
でるもんた・いいじま <L94102@mail.ecc.u-tokyo.ac.jp>
http://user.ecc.u-tokyo.ac.jp/~l94102/dos/
※このメールマガジンで取り上げてほしいテーマ、ご意見など
ありましたら、上のメールアドレスまでお気軽にどうぞ。
☆配信☆
このメールマガジンは、「インターネットの本屋さん・まぐまぐ」を
利用して配信しています。
http://www.mag2.com (マガジン ID=0000022456)
☆バックナンバー・登録解除・メールアドレス変更は☆
上記のホームページまでどうぞ。
なお、手動での登録解除は行っておりませんのでご了承下さい。
=========================================================================
Copyright © IIJIMA Hiromitsu aka Delmonta,
2016/03/10 15:09 JST
これは「古文書」です。
古くなった情報も原則未修正で保存していますのでご注意ください。