Skip to content

ファイルディスクリプタとシェルリダイレクトの基礎

ファイルディスクリプタ(FD)とは

UNIX 系 OS では、プロセスが扱う入出力は番号付きの識別子で管理される。これをファイルディスクリプタ(File Descriptor / FD)と呼ぶ。

FD番号 名前 内容
0 stdin 標準入力
1 stdout 標準出力
2 stderr 標準エラー出力

通常、stdout と stderr はともにターミナル(画面)へ表示される。

基本的なリダイレクト

リダイレクトとは、入出力の行き先を別の場所へ付け替えること。

# 標準出力をファイルに書き込む(上書き)
command > output.log

# 標準出力をファイルに追記
command >> output.log

# 標準入力をファイルから読み込む
command < input.txt

FDリダイレクト:2>&1

2>&1
  • 2> : FD 2(stderr)の出力先を変更する
  • &1 : ファイルではなく FD 1(stdout)を指定する

つまり、stderr を stdout と同じ行き先に向ける指定。

典型的な使用例

# stdout と stderr を両方ログに保存
command > all.log 2>&1
  • stdout → all.log
  • stderr → stdout → all.log

すべての出力を1ファイルに集約できる。

順序の重要性

# NG: 意図どおり動かない
command 2>&1 > all.log

FD リダイレクトは左から順に評価される。この場合: 1. 2>&1: stderr が「その時点の stdout(ターミナル)」に向く 2. > all.log: stdout だけが all.log に変わる

結果として stderr はターミナルに出てしまう。

正しい書き方:

command > all.log 2>&1

省略記法(bash / zsh)

# 以下2つは同じ意味
command > all.log 2>&1
command &> all.log

出力の破棄

# stdout と stderr を両方捨てる
command > /dev/null 2>&1

まとめ

  • ファイルディスクリプタは stdin(0) / stdout(1) / stderr(2) の3つが基本
  • 2>&1 は stderr を stdout の行き先に向ける
  • FD リダイレクトは左から順に評価される(順序が重要)
  • &> file> file 2>&1 の省略記法

応用

シェルリダイレクトの応用 - tee・ヒアドキュメント・exec も参照。

引用元: FDリダイレクトとは? / シェルスクリプト ファイル記述子とリダイレクトの仕組み