【>/>>】「結果をファイルに保存」- リダイレクトを理解する-【続・Linuxコマンド入門 #1】

前回のシリーズ Linuxコマンド入門では、基本的なlinuxコマンドについて各々のコマンドの使い方やオプションについて紹介しました。lsgrepchmod など、一つ一つのコマンドが「点」として使えるようになったと思います。

UBUNTU-linuxコマンド入門シリーズのサムネイル。この記事シリーズでは、よく使うコマンドを優先的に紹介し、シリーズを通して最低限コマンドライン操作ができるようになることを目標に紹介しています。 18 記事
シリーズ

Linuxコマンド入門

LINUXコマンドの基礎について、ゼロから最低限ファイル操作などができるようになるまでの手順を紹介します。linux系な...

続・Linuxコマンド入門シリーズでは、いよいよそれらの「点」を「線」で結ぶ技術を学びます。 コマンドを自在に組み合わせ、手作業を「自動化」していくための第一歩なので、理解して扱えるようになりましょう。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。

その第一回目となる今回は、コマンドの実行結果をターミナル(画面)ではなく、ファイルに保存する技術、「リダイレクト」を紹介します。

標準出力と標準エラーについて知り、Linuxコマンドのリダイレクトを理解する。

1. 「標準出力」と「標準エラー出力」とは?

リダイレクトを理解するために、まず「コマンドの結果は2種類ある」ということを知る必要があります。

あなたが ls などのコマンドを実行すると、結果がターミナル(黒い画面)に表示されますね。

実は、この「画面に表示される結果」は、厳密には2つの別々の流れ(ストリーム)で送られています。

  1. 標準出力 (stdout)
    • コマンドが正常に成功したときの「結果」が流れる、メインの通り道です。
    • ls を実行したときのファイル一覧や、cat を実行したときの中身などがこれにあたります。
  2. 標準エラー出力 (stderr)
    • コマンドが失敗したときの「エラーメッセージ」が流れる、別の通り道です。
    • 「ファイルが見つかりません (No such file or directory)」といった警告やエラーがこれにあたります。

普段は、この2つが両方とも「ターミナル」という同じ場所に表示される設定になっているため、私たちは区別なく見ています。

しかし、Linuxでは、この2つの流れの「行き先」を自由に変えることができます。これが「リダイレクト」です。


イメージ:蛇口(コマンド)とバケツ(ファイル)

説明欄リダイレクトを「蛇口とバケツ」でイメージしてみましょう。

  • コマンド (lsなど): 水を出す「蛇口」
  • ターミナル (画面): デフォルトの「排水溝」(流しっぱなし)
  • ファイル: 水を溜めるための「バケツ」

ls と打つと、蛇口から「ファイル一覧」という水が「排水溝(ターミナル)」に流れていきます。

「リダイレクト(>)」とは、この蛇口の先に「ホース」を取り付けて、水の流れを「バケツ(ファイル)」に向ける操作なのです。

linuxの標準出力と標準errorについて、蛇口でイラスト化し、redirectで出力先を変更できることを表すイラスト

2. > (上書き保存) の使い方

>(大なり記号)は、標準出力 (stdout) の行き先をファイルに変更する記号です。

[コマンド] > [保存したいファイル名]

> を使うと、コマンドの結果はターミナルには一切表示されなくなり、代わりに指定したファイルに上書き保存されます。

実行例

# まずは普通に ls -l を実行(ターミナルに表示される)
ls -l
# total 4
# drwxr-xr-x 2 user group 4096 11月 15 04:00 documents

# 次に「>」を使ってファイルに保存する
ls -l > file_list.txt

# (何も表示されない!)

結果が画面に出ませんね。では、catfile_list.txt の中身を見てみましょう。

cat file_list.txt
# total 4
# drwxr-xr-x 2 user group 4096 11月 15 04:00 documents

このように、ls -l の結果がそのままファイルに保存されていることがわかります。

注意:> は「上書き」 > は、指定したファイルがすでに存在する場合、中身を容赦なく消去して、新しい内容で上書きします

大事なログファイルなどに誤って > を使ってしまうと、過去のデータがすべて消えてしまうため、非常に危険です。


3. >> (追記保存) の使い方

「上書き」の危険を回避し、既存のファイルの中身を残したまま、末尾に結果を「追記」したい場合に使うのが >> です。

 [コマンド] >> [追記したいファイル名]

これは、ログの記録などに非常に便利です。

実行例

先ほどの file_list.txt に、今度は pwd の結果を「追記」する例です。

# (実行前)file_list.txt の中身
cat file_list.txt
# total 4
# drwxr-xr-x 2 user group 4096 11月 15 04:00 documents

# 「>>」を使って pwd の結果を追記する
pwd >> file_list.txt

# (実行後)もう一度中身を確認する
cat file_list.txt
# total 4
# drwxr-xr-x 2 user group 4096 11月 15 04:00 documents
# /home/user

ls -l の結果が消えずに、その下に pwd の結果が追加されているのがわかりますね。


5. 2> (エラー出力の保存) の使い方

>>> は、蛇口から出る「きれいな水(標準出力)」だけをバケツ(ファイル)に入れます。 では、コマンドが失敗したときの「油(標準エラー出力)」はどうなるのでしょう?

実は、> を使っても、エラーメッセージはファイルに保存されず、ターミナルに表示されてしまいます

# 存在しないファイル "error.txt" を ls しようとする
ls -l error.txt > output.txt
# ls: 'error.txt' にアクセスできません: そのようなファイルやディレクトリはありません

output.txt に保存しようとしたのに、エラーは画面に出てしまいました。output.txt の中は空っぽです。

この「エラー出力(stderr)」だけをファイルに保存したい場合に使うのが 2> です。 (1 が標準出力、2 が標準エラー出力、と番号が決まっているためです)

 [コマンド] 2> [エラーログファイル名]

実行例

先ほどの失敗するコマンドを 2> で実行してみます。

# 存在しないファイル "error.txt" を ls しようとする
# 「2>」を使ってエラーを error_log.txt に保存する
ls -l error.txt 2> error_log.txt


# error_log.txt の中身を確認する
cat error_log.txt
# ls: 'error.txt' にアクセスできません: そのようなファイルやディレクトリはありません

今度はエラーメッセージがファイルにしっかり保存されました。 これにより、「正常な結果」と「エラー」を別々のファイルに分けて管理することができます。


まとめ

今回は、コマンドの実行結果の行き先を変える「リダイレクト」を学びました。

  • > : 標準出力 (stdout) をファイルに上書き保存
  • >> : 標準出力 (stdout) をファイルに追記保存
  • 2> : 標準エラー出力 (stderr) をファイルに上書き保存

これで、コマンドの実行結果を「バケツ(ファイル)」に溜められるようになりましたね。

次回(#2)は、いよいよ続シリーズの核となる「パイプ |」です。 バケツ(ファイル)に一度保存するのではなく、あるコマンドの結果を、直接「次のコマンド」にベルトコンベアのように渡す技術を学びます!

linuxコマンド入門、コマンドの出力を次のコマンドに受け渡す "|" パイプの使い方について紹介。

【 | 】コマンドを繋げる「パイプ」~ | の使い方~【続・Linuxコマンド入門 #2】

コマンドを繋げる「パイプ (|)」入門!あるコマンドの結果を、ls | grep のように次のコマンドへ直接渡す仕組みを、初心者向けにわかりやすく解説します。

linuxコマンドを連結しより高度に扱うためのパイプやリダイレクトの仕方について紹介するシリーズのサムネイル 5 記事
シリーズ

続・Linuxコマンド入門 ~パイプとリダイレクトを使いこなす~

Linuxコマンドの出力に対して処理してデータを加工したり、処理を自動化する「コマンド結合」の方法について紹介します。