01 / 07
コマンドには出口と入口がある
この章の主役はつなぎ方だよ。そのために、まず1つの見取り図を覚えてほしい。
どのコマンドにも、出口が2つと入口が1つ付いているんだ。
- 標準出力 … ふつうの結果が出てくる出口
- 標準エラー出力 … エラーだけが出てくる出口
- 標準入力 … 文字を受け取る入口
ふだんは出口2つとも画面につながっているので、区別が見えないだけだよ。この章でそれを別々の行き先につなぎ替えることを覚えるんだ。
つなぐ
INPUT · スライド
01 / 07
この章の主役はつなぎ方だよ。そのために、まず1つの見取り図を覚えてほしい。
どのコマンドにも、出口が2つと入口が1つ付いているんだ。
ふだんは出口2つとも画面につながっているので、区別が見えないだけだよ。この章でそれを別々の行き先につなぎ替えることを覚えるんだ。
02 / 07
> を書くと、標準出力の行き先が画面からファイルに変わるよ。
```
ls > ichiran.txt
```
打っても画面には何も出ない。結果はファイルの中に入ったからだね。
> は「こっちに流して」という向きの矢印だと思えばいいよ。左のコマンドの結果が、右のファイルに流れこむんだ。
~ $ ls > ichiran.txt~ $ cat ichiran.txtkazu.txtkekkamemo.txtnamae.txt03 / 07
> の右に書いたファイルは、無ければ作られるよ。先に touch しておく必要はない。
そして、あれば中身が消される。ここが怖いところだよ。
```
echo A > memo.txt # memo.txt の中身は A だけになる
```
確認も警告も出ない。黙って上書きするんだ。これは Unix の道具ぜんぶに共通する態度で、「打った人は分かっているはず」という作りなんだよ。
04 / 07
> はどのコマンドにも使えるよ。出口をつなぎ替えるだけで、コマンドの側は何も知らないままなんだ。
```
ls > ichiran.txt
sort kazu.txt > narabeta.txt
wc -l namae.txt > kazoeta.txt
find . -name '*.txt' > mitsuketa.txt
```
この「どの道具にも同じやり方が効く」ところが、コマンドラインの気持ちよさだよ。覚えることが増えないんだ。
05 / 07
ひとつだけ、絶対にやってはいけない形があるよ。
```
sort kazu.txt > kazu.txt # ✗ 中身が消える
```
読みながら書けそうに見えるけれど、シェルは先にファイルを空にしてからコマンドを動かすんだ。だから sort が読むときには、もう何も残っていない。
結果は 0 バイトのファイル。この失敗はよくあるので、いちど自分の目で見ておこう(あとの問題でやるよ)。
06 / 07
実は > はコマンドのうしろでなくてもいいんだ。
```
> out.txt ls # これも動く
ls > out.txt # ふつうはこう書く
```
同じ意味だよ。> はシェルへの指示で、コマンドの引数ではないから、どこに書いてもいいんだ。
ふつうはうしろに書くけれど、この事実は「> はコマンドが受け取っているのではない」ことの証しになるので覚えておいて。ls は自分がファイルに書いていると気づいてもいないんだよ。
07 / 07
namae.txt に3人の名前、kazu.txt に3つの数、memo.txt に1行のメモが入っているよ。kekka という空の入れ物もあるよ。
書き出したら、必ず cat で確かめる癖をつけよう。画面に出ないやり方をしているときは、確かめないと成功したのか分からないからね。