Unixのリダイレクション機能とは
Unixのシェルはコマンドの入出力を切り替える機能を持っている。
これがリダイレクション。
デフォルトでは標準入力はキーボード、標準出力は画面に割り当てられているが、
これを変更することができる。
標準出力をファイルにリダイレクトする
以下の書式を使えば標準出力をリダイレクトできる。
【コマンド】 > 【ファイルのパス】
例)今月のカレンダーをcal.txtに書き出す
例として、今月のカレンダーをcal.txtというファイルに書き出します。
$ cal > cal.txt
cat で確認してみる
$ cat cal.txt
結果はこう
December 2018
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
「>」の注意点
既に存在するファイルに対してリダイレクションを行うと、そのファイルの中身が警告なしで消去されてしまう。(上書きされるので、元の内容が消えてしまう。)
では、では消去させずに追記させるにはどうしたら良いか?
答えは「>>」を使う。
ファイルに追加する「>>」
依存のファイルを消去せずに、内容を追加するには「>>」を使う。
なお、存在しないファイルに対して「>>」を使用すると新たなファイルを生成する。
つまり存在しないファイルに対する「>」と「>>」の働きは同じ。
github使ったことある人はみんな見たことあるハズ
実はこれgithubでリポジトリ作成した時に、表示されるんです。
echo "# test" >> README.md // ←これ
git init
git add README.md
git commit -m "first commit"
git remote add origin https://github.com/USER_NAME/REPOSITORY_NAME.git
git push -u origin master
一行目のecho "# test" >> README.md
これは正にファイルに追加する「>>」これです。
出力の方はこの辺にして、入力いきます。
標準入力をファイルにリダイレクトする
以下の書式を使えば標準入力をリダイレクトできる。
【コマンド】 < 【ファイルのパス】
と言っても、これの使用機会は少ない。
なぜならコマンドの引数でファイルを指定できるので、わざわざ使う必要がないから。
例えばこれは同じ結果になる。
// catコマンドの引数を使用
$ cat cal.txt
// リダイレクション機能を使用
$ cat > cal.txt
標準出力と標準入力を同じファイルにリダイレクト出来ない
標準出力を入力と同じファイルにリダイレクトすると、中身が消える。
同じファイルに上書きしようとしてこんな操作をしてしまうと中身が消えてしまう。
$ cat cal.txt > cal.txt
リダイレクションのまとめ
その他もまとめるとこうなる。
記号 | 説明 |
---|---|
> | 標準出力のリダイレクション(ファイルが存在していれば上書き) |
>> | 標準出力のリダイレクション(ファイルが存在していれば追加) |
< | 標準入力のリダイレクション |
2> | 標準エラー出力のリダイレクション(ファイルが存在していれば上書き) |
2>> | 標準エラー出力のリダイレクション(ファイルが存在していれば追加) |
>& | 標準出力と標準エラー出力を同じファイルにリダイレクション |
参考
Linuxをあまり理解せずに使って分かった気になってたので、以下の本で体系的に再学習しています。(アフィ貼ってないです。)