>100 Views
April 22, 26
スライド概要
はじめまして、ALJ Education Plus 株式会社のyukikoと申します。 IT教育支援や、DX推進が可能です。 ◆ スキル LPIC レベル2 AI / Python Splunk BI(データ可視化・分析) ◆ その他 新卒・未経験の学生向けに、エンジニア転職を応援する資料を趣味で作成しています。 もしよろしければご活用ください。 ◆IT研修講師をお探しの方は [email protected] にお気軽にお問い合わせください。 ※ALJ Education Plus 株式会社を通して、ご支援させていただきます。 ◆Zenn https://zenn.dev/yukiko_sapporo/articles/46c13e9f98b110
LPIC-101 v5.0 | 小豆 本対 応 >&2 ― stderr へ向ける 「ファイル名ではなく FD 番号」で指定するリダイレクト 新卒・文系・未経験のための IT 研修 cat >&2 / 2>&1 の & の意味を完全理解する うさうさラーメン店方式
PROBLEM 今日のお題 ― B問題セット 問14 cat の出力を標準エラーにリダイレクトするものはどれですか。 1 cat > -1 2 cat << ERR 3 cat >&2 4 cat >> 2 5 cat | error ※ 単一選択(正解は1つ) LPIC-101 | >&N ― FD 間のリダイレクト 2 / 10
① この用語 「>&」記号の意味 用語 >&N FD間リダイレクト / 既に開いてる出口へ うさうさラーメン店で例えると 店内には3つの配膳口 0=入口 / 1=客席 / 2=厨房連絡 それぞれ番号で呼び分け & は「ファイル名ではなくFD番号」 という目印。 ↓ >&2 = 「fd=2 と同じ場所に 出せ」 = stderr へ出力。 & を忘れると「2という名前のファイル」扱いに。 cat >&2 = 「客席(1)じゃなくて 厨房連絡口(2)に運んで」 番号で呼ぶから & が必要 LPIC-101 | >&N ― FD 間のリダイレクト 3 / 10
② 簡単に 2> 2>&1 >&2 3つのFDリダイレクトを覚えるだけ stderr をファイルに エラーだけ別ファイル cmd 2> err.log stderr を stdout と同じに 両方まとめて一つに cmd > out 2>&1 stdout を stderr へ ※ 今回の正解 echo warn >&2 ★ 読み方: N> = 「FD N を」、&M = 「FD M と同じ場所へ」 LPIC-101 | >&N ― FD 間のリダイレクト 4 / 10
③ 詳しく① 「&」の有無で全く別の意味になる ○ cat >&2 × cat >> 2 解釈 解釈 > は「出力を」 &2 は「fd=2 (stderr) へ」 >> は「追記」 2 は「2という名前のファイル」 =「標準エラーへ出力」 =「ファイル名 2 に追記」 実行結果: 普段通り画面に出る (標準エラーも画面に表示される) 実行結果: カレントに「2」という ファイルが作られてしまう & が「番号扱い」スイッチ。これを落とすとファイル扱いになる。 LPIC-101 | >&N ― FD 間のリダイレクト 5 / 10
③ 詳しく② 紛らわしい他の選択肢の正体 cat > -1 ファイル名「-1」に書込 cat << ERR ヒアドキュメント入力 cat | error 存在しないコマンドへパイプ → 「-1」という名前のファイルに書き出す(できる)。stderrとは無関係。 → 「ERR」が現れるまでの入力を cat に渡す。方向は入力で出力ではない。 → error というコマンドに cat の出力を渡そうとする。「command not found」。 ★ どれも「stderrに送る」機能ではない。>&2 でないと成立しない。 LPIC-101 | >&N ― FD 間のリダイレクト 6 / 10
③ 詳しく③
実機で確認(Ubuntu / RHEL 共通)
stdout と stderr を分けて確認する定番テクニック
Terminal ― >&2 の挙動確認
# ① echo の出力を stderr へ(警告メッセージの典型)
$ echo "WARNING!" >&2
WARNING!
# ② stdout と stderr を別ファイルに分けて確認
$ (echo OUT; echo ERR >&2) > out.txt 2> err.txt
$ cat out.txt
OUT
$ cat err.txt
ERR
# ③ 失敗例: & を忘れると2という名前のファイルが作られる
$ echo test > 2
$ ls 2
2
← ファイル扱い!
LPIC-101 | >&N ― FD 間のリダイレクト
7 / 10
APPLY 原理原則で5択を斬る # コマンド 判定 理由 1 cat > -1 × 誤り 「-1」というファイル名に書き出す。stderrではなく通常のファイル 2 cat << ERR × 誤り ヒアドキュメント(入力方向)。出力の話ではない 3 cat >&2 ○ 正解 >& の組で「fd=2 へ出せ」= stderr へのリダイレクト 4 cat >> 2 × 誤り 「2」というファイル名に追記。& がないのでFD番号にならない 5 cat | error × 誤り error は(普通)存在しないコマンド。パイプはリダイレクトではない → 正解は 3番。「&2」の組が FD=2 (stderr) の合図。 LPIC-101 | >&N ― FD 間のリダイレクト 8 / 10
ANSWER 正解 ― 「&」が番号扱いの目印 正解 ③ cat >&2 >&2 = 「fd=2(標準エラー)と同じ場所へ出す」 >&N と N>&M の早見表 >&2 2>&1 &> stdout を stderr へ stderr を stdout へ 両方を同じ場所へ → warn表示 → ログ統合 → bash専用 LPIC-101 | >&N ― FD 間のリダイレクト 9 / 10
④ 原理原則・一言でまとめ >&N は 「& がFD番号」の目印。忘れるとファイル名扱い。 0 1 2 stdin 入力 stdout 出力 stderr エラー >&2 = stderrへ送出。echo warn >&2 はスクリプトの定番 面白きなき世を面白く ─ 石黒 友季子