1.03.3標準
run-checkの標準出力と標準エラーを、両方ともall.logへ上書き保存する。
POSIX形式のファイル記述子複製を使う。
適切な順序はどれか。
× 不正解
リダイレクトは左から処理される。> all.logの後に2>&1と書くと、stderrが既にファイルを指すstdoutと同じ接続になる。
詳細解説
正しい
run-check > all.log 2>&1先にstdoutをall.logへ向け、その接続をstderrへ複製する。
正しい。2>&1を評価する時点でfd 1はall.logを指すため、fd 2も同じ書込先になる。
誤り
run-check 2>&1 > all.logstderrを元のstdoutへ複製した後でstdoutだけをall.logへ変更する。
誤り。fd 2は最初の端末接続を保持し、all.logにはstdoutだけが入る。
誤り
run-check > all.log 1>&2stdoutをファイルへ向けた後、stderrの接続で上書きしてファイルから外す。
誤り。1>&2がfd 1を元のstderrへ複製し直すため、all.logへどちらも残らない。
誤り
run-check 2> all.log > /dev/nullstderrはall.logだがstdoutを破棄し、同じファイルへ保存しない。
誤り。2つのストリームを意図的に分け、stdoutは/dev/nullへ捨てる構造である。
実際に確かめる
一時的な検証環境で実行できる例です。
tmp=$(mktemp); sh -c 'echo out; echo err >&2' >"$tmp" 2>&1; sort "$tmp"; rm -f "$tmp"期待される結果
err
out理解のポイント
- redirectは左から
- 2>&1はfd複製
- 両streamが同じopen fileへ
確認時の注意
- 確認環境: POSIX shell / 一時ファイル
基礎のおさらい
複製は参照
2>&1は文字列として後の変更へ追従する指定ではなく、その時点のfd 1接続をfd 2へ複製する。
Bash短縮形
Bashには&>all.logもあるが、POSIX移植性を求める場面では>all.log 2>&1を使える。
問題IDKL-101-470
確認環境POSIX shell / 一時ファイル
最終技術確認2026-08-13
誤り・権利侵害を報告