つなぐ

INPUT · スライド

エラーだけ分ける(`2>`)

01 / 08

エラーは `>` では拾えない

ひとつ実験してみよう。無いファイルを ls して、その結果を > でファイルに向けるんだ。

```
ls nai.txt > out.txt
```

エラーは画面に出てしまうよ。そして out.txt は空っぽ。

おかしいと思うよね。出口をファイルに向けたのに、なぜ画面に出るんだろう。

答えは「エラーは別の出口から出ている」からだよ。

~ $ ls nai.txt > out.txtls: nai.txt: No such file or directory~ $ wc -c out.txt0 out.txt

02 / 08

出口には番号が付いている

この章のはじめに「出口が2つ」と言ったよね。実はそれぞれに番号が付いているんだ。

| 番号 | 名前 | 中身 |
| --- | --- | --- |
| 0 | 標準入力 | 入ってくるもの |
| 1 | 標準出力 | ふつうの結果 |
| 2 | 標準エラー出力 | エラー |

> は実は 1> の省略形なんだ。だから 1 番だけがファイルに向いて、2 番は画面のままだったんだよ。

エラーを向けたいときは番号を書くよ。それが 2> だよ。

03 / 08

なぜ分けてあるのか

面倒に見えるけれど、これはとても親切な作りなんだ。

> で結果をファイルに集めているとき、エラーが混ざったら困るよね。集計しているデータの中に No such file という行が入ってしまう。

逆に、エラーはすぐ人に見せたい。ファイルに隠れてしまったら気づけないからね。

だから最初から2本に分けてあるんだ。「結果はファイルへ、異常は人の目へ」——これが既定の姿だよ。

04 / 08

`2>` でエラーだけ分ける

```
ls nai.txt 2> err.txt
```

こう書くと、エラーが err.txt に入って画面には何も出なくなるよ。

両方を別々のファイルに分けることもできるよ。

```
ls namae.txt nai.txt > out.txt 2> err.txt
```

out.txt に成功したぶん、err.txt にエラー。1回のコマンドで、うまくいったものと失敗したものを選り分けられるんだ。

~ $ ls namae.txt nai.txt > out.txt 2> err.txt~ $ cat out.txtnamae.txt~ $ cat err.txtls: nai.txt: No such file or directory

05 / 08

`2>&1` でまとめる

逆に「両方まとめて1つのファイルに」ということもあるよ。そのときは 2>&1 と書くんだ。

```
ls namae.txt nai.txt > all.txt 2>&1
```

読み方はこう。「2 番の出口を、1 番と同じところへ」&1& は「1 番という出口のこと」という印だよ(1 というファイル名ではないと伝えるため)。

順番が大事だよ。> all.txt を先に書いてから 2>&1 を書く。逆にすると、1 番がまだ画面のままなので、2 番も画面に行ってしまうんだ。

06 / 08

`/dev/null` — 捨てる場所

/dev/null(デブヌル)は書いたものが消える特別なファイルだよ。どんなに書いても大きくならないし、読んでも何も出てこない。

ゴミ箱ではなく底の抜けたバケツだと思ってね。捨てたものは戻せない。

```
ls namae.txt nai.txt 2> /dev/null
```

エラーだけを捨てて、成功したぶんだけを見る形だよ。

これは find を使うときにいちばん効くよ。あちこち探すと「見る権限がない」というエラーがたくさん混ざるので、2> /dev/null で黙らせるんだ。

07 / 08

エラーをパイプに流すには

パイプ(|)も 1 番の出口だけを渡すよ。だからエラーはパイプを通らないんだ。

```
ls nai.txt | grep No # 何も出ない
ls nai.txt 2>&1 | grep No # 出る
```

エラーメッセージを grep で探したいときは 2>&1 が要るよ。この形は覚えておくと便利。「エラーの数を数える」「エラーの中から特定のものを探す」ができるようになる。

08 / 08

さあ、打ってみよう

この回はわざとエラーを出すよ。nai.txt という存在しないファイルを何度も指定するんだ。

エラーメッセージは3つの部分でできているよ。

```
ls: nai.txt: No such file or directory
↑誰が ↑何について ↑どうだった
```

誰が怒っているかを先に読む癖をつけよう。ls: なのか -sh: なのかで、直す場所が変わるからね。