リダイレクトとパイプ

研究室向けシリーズその2
使う場面を考えてパイプはほぼ省略するけど興味あったら調べてください。

ダイレクト

ダイレクト is 何

いつも通りにプログラムを普通に書いて普通にprintfとかすると普通にコマンドプロンプトに表示されると思います。
 printfしたときの出力先は、標準では端末のディスプレイ*1となっていますが、実は出力先を変更することができます。この出力先を変更する機能のことをリダイレションといいます。リダイレクションを行うことをリダイレクトすると言います。だいたいリダイレクトって言っておけば通じますきっと。
 変更先としてa.txtなど、適当なファイルを指定するとa.txtにプログラムの出力*2が保存されます。

何の役に立つの

ダイレクトを行うことでプログラムの出力を保存することができるので、重要な実験や時間のかかる実験の諸条件*3などを、いちいちコピペせずに保存することができます。あとfopenとかいちいち面倒というときに使えます。

how to リダイレクト

ダイレクトする際はコマンドプロンプト

(プログラムの実行ファイル) > (変更先のファイル名)

のように">"を使って実行ファイルと結果をつないであげます。
例として、printf("( ´_ゝ`)\n");が含まれたa.cをコンパイルしたa.exeを考えます。*4

a.exe > test.txt

のようにすると

type test.txt
( ´_ゝ`)

となります。*5

標準出力とか

標準の出力はstdoutで指定することが出来ます。

  • 標準入力(キーボード): stdin
  • 標準出力(ディスプレイ) : stdout
  • 標準エラー出力(ディスプレイ) : stderr

stderrはリダイレクトによって変わらないのでエラーなど
ダイレクト中でも画面に出力したいときは

fprintf(stderr, "aaa\n");

のように書きましょう。

余談ですが、下記の二行は等価です。

printf("aaa\n");
fprintf(stdout, "aaa\n");

fprintfの普段の使い方と比べながらどういう仕組みなのか考えると、なんとなく分かると思います。

補足

  • visual studioのデバック引数のところでも同様に">"を使ったリダイレクトが可能です。
  • 単に">"とするとファイルを必ず新規作成(既存の内容を破棄)しますが、">>"としてリダイレクトを行うとファイルへの追加(既存の内容を保持)が行えます。

パイプ

パイプ is 何

パイプはプログラムの出力を別のプログラムの入力にする仕組みです。色々なwindowsのコマンドを覚えると組み合わせ次第で強力な効果を発揮するといいな。

how to パイプ

(コマンド1) | (コマンド2)

のようにコマンド(exe等の実行ファイル含む)とコマンドの間を"|"でつなげます。

便利な使い方

研究室内で普通に便利だなと思うものを二つ挙げます

clip
出力結果をクリップボードにコピー(全選択してコピーするのと同じ効果)
a.exe | clip
tee

teeを使うと、出力をファイルにリダイレクトしつつ、コマンドプロンプトにも表示というまさかの両立ができます。
ちなみにTの字に出力が分岐するからteeっていうらしいです*6
teeは残念ながら標準搭載では無いのですが、便利なので入れておくと幸せです。

使い方はこんな感じ

出力をtest.txtにリダイレクトしつつ、コマンドプロンプトにも表示
a.exe | tee test.txt

導入方法は↓
1. ここからntuxtl014.lzhをダウンロードして解凍
1. ntuxtl014\binにあるtee.exeをどこかにコピー(my document\etcを作ってその中に入れたりしてます。)
1. pathを通す。(通し方はググってください。)

おまけ

windowsの地味に便利な機能

  • エクスプローラでalt+Dするとアドレスバーをフォーカスできる
  • エクスプローラのアドレスバーでcmdと入力→ enterとすると、そのフォルダにcdした状態でコマンドプロンプトが開かれる。
  • ls, pwdなどを打ってしまう人は,パスの通ったところにls.bat, pwd.batを置いて、それぞれの中身を@dir /B, @cdとしておくと簡易エイリアスになる。*7 *8

*1:標準の出力先なので標準出力(stdout)といいます、

*2:普通に実行したときにコマンドプロンプトに表示されるもの

*3:反復が何回か、計算時間が何秒か

*4:visual studioのexeはx64\releaseとか\debugの中に入っています。

*5:type ~~でファイルの中身を出力できます。ちなみにtypeの出力もリダイレクト可能です。

*6:本日の知らんがなタイムʅ(‾◡◝)ʃ

*7:コマンドプロンプト上では.batは省略可

*8: windowsのエイリアス(doskey)はコマンドプロンプトを一度閉じると消えてしまう。