メインコンテンツへスキップ
初級7分で読める

標準入出力・標準エラー出力の完全理解

Linuxの標準入力・標準出力・標準エラー出力の仕組みを図解で分かりやすく解説。リダイレクトやパイプの本質を理解しましょう。

基礎編標準入出力リダイレクトパイプ初心者向け

標準入出力とは

Linuxでプログラムを実行すると、必ず3つの「データの通り道」が用意されます。これが標準入力(stdin)標準出力(stdout)、**標準エラー出力(stderr)**です。

  • 標準入力(stdin): プログラムがデータを受け取る入口(ファイルディスクリプタ: 0)
  • 標準出力(stdout): プログラムが結果を出力する出口(ファイルディスクリプタ: 1)
  • 標準エラー出力(stderr): プログラムがエラーメッセージを出力する出口(ファイルディスクリプタ: 2)

実際に見てみよう

以下のPlaygroundで、標準出力と標準エラー出力の違いを確認してみましょう。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

標準出力と標準エラー出力の違い

通常の出力とエラーの分離

# 正常なメッセージは標準出力へ
$ echo "Hello, World!"
Hello, World!

# エラーメッセージは標準エラー出力へ
$ ls /存在しないディレクトリ
ls: /存在しないディレクトリ: No such file or directory

なぜ分離されているのか?

標準出力と標準エラー出力が分離されている理由は、正常な結果とエラーメッセージを別々に扱えるようにするためです。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

リダイレクトの基本

標準出力のリダイレクト

>を使って標準出力をファイルに保存できます。

# 標準出力をファイルに保存
$ echo "Hello" > output.txt

# ファイルに追記
$ echo "World" >> output.txt
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

標準エラー出力のリダイレクト

2>を使って標準エラー出力をファイルに保存できます。

# 標準エラー出力をファイルに保存
$ ls /notexist 2> error.txt

# 標準出力と標準エラー出力を別々のファイルに
$ ls /home /notexist > output.txt 2> error.txt
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

高度なリダイレクト技法

標準出力と標準エラー出力を同じファイルに

# 方法1: &>を使う(bash専用)
$ command &> all_output.txt

# 方法2: 2>&1を使う(より汎用的)
$ command > all_output.txt 2>&1

2>&1の意味を理解する

2>&1は「ファイルディスクリプタ2(標準エラー出力)を、ファイルディスクリプタ1(標準出力)と同じ場所に向ける」という意味です。

CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

順序の重要性

リダイレクトの順序は重要です!

# 正しい: 先に標準出力をファイルに向けてから、標準エラー出力を標準出力に向ける
$ command > file.txt 2>&1

# 間違い: この順序だと標準エラー出力は画面に表示される
$ command 2>&1 > file.txt

標準入力のリダイレクト

<を使ってファイルから標準入力を読み込めます。

# ファイルの内容を標準入力として使用
$ wc -l < file.txt

# ヒアドキュメント(複数行の入力)
$ cat << EOF
line 1
line 2
line 3
EOF
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

/dev/nullの活用

/dev/nullは「ブラックホール」のような特殊ファイルで、書き込まれたデータはすべて破棄されます。

# 標準出力を破棄
$ command > /dev/null

# 標準エラー出力を破棄
$ command 2> /dev/null

# 両方を破棄(静かに実行)
$ command > /dev/null 2>&1
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

パイプとの組み合わせ

パイプ(|)は前のコマンドの標準出力を次のコマンドの標準入力につなげます。

# 標準出力のみがパイプで渡される
$ ls -la | grep ".txt"

# 標準エラー出力もパイプに含めたい場合
$ ls -la /home /notexist 2>&1 | grep "error"
CommandAcademy Terminal
Welcome to CommandAcademy Terminal!
Type "help" to see available commands.
user@cmdac:~$

ファイルツリー

/
etc
hosts35B
passwd76B
home
user
tmp
usr
bin
share
var
log

実践的な活用例

ログの分離保存

# 正常なログとエラーログを分けて保存
$ ./script.sh > output.log 2> error.log

# タイムスタンプ付きで保存
$ ./script.sh > "output_$(date +%Y%m%d).log" 2> "error_$(date +%Y%m%d).log"

デバッグ時の活用

# エラーのみを確認
$ command 2>&1 >/dev/null | grep "ERROR"

# 実行結果を画面に表示しながらファイルにも保存
$ command 2>&1 | tee output.log

まとめ

標準入出力を理解することで、以下のようなことが可能になります:

  1. 出力の制御: 必要な情報だけを取り出したり、不要な出力を隠したりできる
  2. エラーハンドリング: エラーメッセージを適切に処理・記録できる
  3. 自動化: スクリプトでの出力管理が容易になる
  4. デバッグ: プログラムの動作を詳細に追跡できる

これらの概念は、Linuxを使いこなす上で非常に重要な基礎知識です。ぜひPlaygroundで色々試して、体で覚えてください!

次のステップ

もっと詳しく学びたい方へ

YouTubeチャンネルでは、図解を使った分かりやすい動画解説を公開しています

チャンネル登録する

関連記事