はじめに
Linux のコマンドは、通常、すべての内容を画面に表示します。しかし、そのデータを保存したい場合はどうすればよいでしょうか。
この処理を リダイレクト(Redirection) と呼びます。郵便物に「転送先住所」を指定するようなものです。
シェル構文全般について考えるときも、このイメージが役立ちます。リダイレクトは、コマンドの基本的な動作を変更するのではなく、入力または出力の送り先を変更します。
この実験では、データの送り先を制御する次の 3 つの方法を学びます。
- リダイレクトして上書き(
>):出力をファイルに保存し、既存の内容を置き換えます。 - リダイレクトして追加(
>>):ファイルの末尾に出力を追加します。 - エラーのリダイレクト(
2>):エラーメッセージだけを取得します。
出力をリダイレクトする(上書き)
大なり記号 > は、上書き(Rewrite) 演算子です。
多くの初心者は > を「ファイルに保存する」と覚えます。しかし、より正確には「標準出力をこのファイルに送り、以前の内容を置き換える」と考えるとよいでしょう。この表現は、コマンドを慎重に組み合わせるようになったときに重要になります。
> は Linux に対して、「このコマンドの入力を受け取り、このファイルに書き込んでください。ファイルが存在する場合は、先に内容を消去してください」と指示します。
プロジェクトディレクトリに移動します。
cd ~/project
出力を output.txt にリダイレクトします。
echo "Hello, Linux." > output.txt
画面には何も表示されません。テキストはファイルに書き込まれています。次のコマンドで確認します。
cat output.txt
次に、なぜこれを「上書き」と呼ぶのかを確認します。次のコマンドを実行してください。
echo "This is new content." > output.txt
cat output.txt
以前の "Hello, Linux." はなくなっています。> 演算子によって、ファイルの内容が完全に置き換えられました。
このため、リダイレクトはファイルを変更する操作と同じように注意して扱う必要があります。短いコマンドでも、既存のファイルの内容をすぐに置き換える可能性があります。
出力を追加する(>>)
データを消去するのではなく、既存の内容に追加したい場合もあります。そのときは、2 つの大なり記号 >> を使います。
これは 追加(Append) の指示として動作します。
output.txt に新しい行を追加します。
echo "This line is appended." >> output.txt
cat output.txt
2 行とも表示されるはずです。
元の内容はそのまま残っています。もう一度実行してみましょう。
echo "Another line." >> output.txt
cat output.txt
この >> 演算子は、ログに最適です。
多くの運用ファイルは、最初から作り直すのではなく、時間とともに大きくなっていきます。ログ、レポート、コマンド履歴などでは、末尾に追加する方法がよく使われます。
エラーをリダイレクトする(2>)
Linux では、「正常な出力(stdout)」と「エラー出力(stderr)」が分けられていることを学びました。
> と >> 演算子が扱うのは、厳密には「正常な出力」だけです。エラーは対象になりません。
ここで、前の実験で学んだストリームの仕組みが実際に役立ちます。出力とエラーが別々のストリームであれば、Linux ではそれぞれを異なる送り先に振り分けられます。
エラーを取得するには、2> を使います。標準エラーの ID は 2 です。
存在しないディレクトリを一覧表示してみます。
ls /missing_directory 2> error.log
画面には何も表示されません。エラーは取得され、error.log に書き込まれています。
次のコマンドで内容を確認します。
cat error.log
ファイル内にエラーメッセージが保存されていることを確認できます。
2> の 2 は、標準エラーに割り当てられた慣例的なファイルディスクリプター番号に由来します。現時点では、すべてのファイルディスクリプターを暗記する必要はありません。ただし、これらの番号がシェルのストリーム用チャネルを指していることは覚えておくと役立ちます。
まとめ
これで、データの流れを制御する方法を身につけました。
>(上書き):出力をファイルに保存します(以前の内容は消去されます)。>>(追加):ファイルの末尾に出力を追加します(履歴を保持します)。2>(エラーのリダイレクト):エラーメッセージを取得します。
これらのツールを使うと、コマンドの結果を効率よく保存できます。



