1.03.3標準
端末から次のコマンドを実行する。
run-check 2>&1 > output.log
一般的な結果として適切なのはどれか。
× 不正解
2>&1 > fileでは、stderrはその時点のstdoutである端末へ複製され、その後stdoutだけがfileへ切り替わる。
詳細解説
誤り標準出力と標準エラーの両方がoutput.logへ入る
stderrはstdoutがファイルへ変わる前の端末接続を複製している。
誤り。両方をファイルへ入れるにはstdoutの変更後にstderrを複製する必要があり、順序が逆である。
正しい標準出力はoutput.logへ入り、標準エラーは元の端末へ出る
2>&1を先に処理し、その後stdoutだけをファイルへ変更する。
正しい。最初の2>&1でstderrは端末へ、後の> output.logでstdoutだけがファイルへ切り替わる。
誤り標準エラーだけがoutput.logへ入り、標準出力は端末へ出る
この構文では2>fileを指定していない。
誤り。output.logへ向くのは>で指定されたstdoutであり、stderrではない。
誤り両方とも破棄される
/dev/nullへの接続はなく、どちらも有効な接続先を持つ。
誤り。どちらのfdも端末またはファイルへ接続され、破棄先は指定されていない。
実際に確かめる
一時的な検証環境で実行できる例です。
tmp=$(mktemp); captured=$(sh -c 'echo out; echo err >&2' 2>&1 >"$tmp"); printf 'terminal=%s file=%s\n' "$captured" "$(cat "$tmp")"; rm -f "$tmp"期待される結果
terminal=err file=out理解のポイント
- 2>&1はその時点を複製
- 後続>はstdoutだけ変更
- 順序が意味を変える
確認時の注意
- 確認環境: POSIX shell / 一時ファイルとcommand substitution
基礎のおさらい
シェルによる設定
リダイレクトはrun-check自身が解釈する引数ではなく、起動前にシェルがfdを設定する。
順序の可視化
各演算子の直後に0・1・2が何を指すかを書き出すと複雑な指定を判断しやすい。
問題IDKL-101-471
確認環境POSIX shell / 一時ファイルとcommand substitution
最終技術確認2026-08-13
誤り・権利侵害を報告