サンプル集  >  MS-DOS  >  リダイレクトの調査
リダイレクトの調査
2024/12/30

リダイレクトの > と >> の調査をします。

◆環境
OS Windows 10 Home 22H2

①標準出力をリダイレクト

標準出力をout.logというファイルへ出力するよう指定します。

>copy a b > out.log

out.logの内容を見てみます。

>type out.log
指定されたファイルが見つかりません。

実際にはファイルがないため、標準エラー出力にエラーメッセージが出力されたと推測されます。 ただ、リダイレクトでは標準出力と標準エラー出力は別に出力されると思うのでこの動作は謎です。

②標準出力と標準エラー出力をリダイレクト

標準出力と標準エラー出力でファイルを分けてみます。

>copy a b > out.log 2 > err.log

out.logファイルはできず、err.logファイルができて内容は前回のout.logと同じでした。

③標準出力と標準エラー出力をリダイレクト②

2と>の間を詰めたところ動きが変わりました。

>copy a b > out.log 2> err.log

>dir
2024/12/30  14:43                 0 err.log
2024/12/30  14:43                38 out.log

err.logは0バイト、out.logには以前と同じ内容が出力されていました。

④標準エラー出力を標準出力へリダイレクト

標準エラー出力を標準出力にリダイレクトしてみます。

>copy a b > out.log 2>&1

out.logに同じものが出力されています。

⑤標準エラー出力を標準出力へリダイレクト①

2>と&1の間に空白を入れてみます。

>copy a b > out.log 2> &1
& の使い方が誤っています。

⑥標準エラー出力を標準出力へリダイレクト②

2と>の間に半角空白を入れたところ「ハンドルを複製できない」というメッセージが表示されました。

>copy a b > out.log 2 >&1
ハンドル 1 のリダイレクト中に
ハンドルを複製できませんでした。

「2 >」と「2>」で解釈が違うようです。

⑦標準エラー出力を標準出力へリダイレクト③

>と&1の間を空けてみます。

>copy a b > out.log 2 > &1
& の使い方が誤っています。

⑧copyコマンドからdirコマンドで検証

dirコマンドでファイルがないと標準エラー出力にエラーが出力されるようです。

>dir *.abc > out.log 2> err.log

>dir
2024/12/30  21:08                26 err.log
2024/12/30  21:08               148 out.log

>type out.log
 ドライブ C のボリューム ラベルは OS です
 ボリューム シリアル番号は C43E-C3C1 です

 C:\src のディレクトリ

>type err.log
ファイルが見つかりません

⑨エラーがない状態での検証

>dir > out.log 2> err.log

>dir
2024/12/30  21:25                 0 err.log
2024/12/30  21:25               443 out.log

エラーがなくても2>を指定すると0バイトでファイルが作成されるようです。

出力結果だけだと標準出力か標準エラー出力かの見分けがつかないですね。

 > out 正常動作
 > out 2 > err
 > out 2> err 正常動作だった模様
 > out 2>&1 正常動作(標準出力にリダイレクト)
 > out 2> &1 ERROR(& の使い方が誤っています。)
 > out 2 >&1 ERROR(ハンドルを複製できませんでした。)
 > out 2 > &1 ERROR(& の使い方が誤っています。)
 > out 2> err 正常動作。標準エラー出力あり。
 > out 2> err 正常動作。標準エラー出力なし。(③と同じ?)

ファイルの追加書き込み

>だけだと実行する都度ファイルが新規作成されます。 以前の内容を残したまま追加出力したい場合、>>のように>を2つ使います。

1 >> out 2> err 標準出力だけ追加。標準エラー出力は毎回新規作成。
2 >> out 2>> err 標準出力も標準エラー出力も追加。
3 >> out 2>&1 標準エラー出力を標準出力にリダイレクトし追加。
4 >> out 2>>&1 標準エラー出力を標準出力にリダイレクトする指定を>>にしても動作は同じ。
5 > out 2>>&1 標準出力が>だけだと標準エラー出力を>>にしても追加にならない。

分かったことまとめ

  1. 2>で1つの固まり。
  2. リダイレクトする場合、2>&1で1つの固まり。
  3. 2>>&1でのリダイレクトは意味がなさそう。標準エラー出力を標準出力にリダイレクトするので、ファイルの新規作成か追加は標準出力の指定に従う模様。

▲ PageTop  ■ Home


Copyright (C) 2024 ymlib.com