>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 マスター学習ツール【B問題セット】 問32 シェル・リダイレクト Q bashでコマンドの後に「2>&1」を挿入するとどのようにリダイレクトされますか 。 ✓ 正解 → 標準エラー(2)を標準出力(1)へ(合流させる) LPIC-101 | 問32 シェル・リダイレクト 1/6
1 この用語は? 2>&1(にーだい・あんぱさんど・いち) FD2(標準エラー)をFD1(標準出力)と同じ行き先へ複製する/合流させる記法 かんたん定義 ■ 2 = 標準エラー出力(stderr) / 1 = 標準出力(stdout) を表すファイルディスクリプタ番号 ■ 「&」があることで「FD1というファイル」ではなく「FDの番号1」を意味する ■ つまり『stderr の行き先を、いま stdout が向いている場所に合わせる』という意味 ■ 代表例:command > log.txt 2>&1 → エラーも通常出力も全部 log.txt に記録 LPIC-101 | 問32 シェル・リダイレクト 2/6
2 簡単に書くよ ※正確な表現ではありません ざっくりイメージ ■ Linuxでは、画面への出力には『普通の出 力』と『エラー出力』の2種類がある ■ どちらも普段は画面に出るが、ファイルに したいとき困る ■ `>` で普通の出力はファイルに送れるけど 、エラーだけ画面に残ってしまう ■ そこで `2>&1` =『エラーも同じ行き先に 合流させて!』の呪文 ■ 逆は `1>&2`(出力をエラー側へ)、全捨 ては `>/dev/null 2>&1` LPIC-101 | 問32 シェル・リダイレクト 図解で理解 ファイルディスクリプタ(FD) 0 1 2 stdin stdout stderr 標準入力 標準出力 標準エラー 2>&1 stderr を stdout の行き先に合流! エラーも通常出力も 同じ場所(画面 or ファイル)へ ex) cmd > all.log 2>&1 3 /6
3 詳しく書くよ ※原理原則 原理原則: 2>&1 = FD2(stderr)の出力先を、その時点でFD1(stdout)が向いている場所 へ複製する ■ Linuxプロセスは起動時に3つのFDを持つ: 0=stdin, 1=stdout, 2=stderr ■ ■ 通常は 1 も 2 も端末(/dev/tty)に繋がっているので、画面に混ざって出る リダイレクト記法は順番が左→右で評価される(超重要) ■ 〇 正しい例:cmd > out.txt 2>&1(まず1をout.txtに、その後2も1(=out.txt)にコピー) ■ ■ × 間違い例:cmd 2>&1 > out.txt(2を先に1=端末にコピー、あとで1だけファイルに。エラーは画面のま ま) 短縮記法:bashでは &> file や &>> file で stdout と stderr の両方を同じファイルに ■ ■ パイプにstderrも流す:cmd |& grep ERR (bash 4以降) 全部捨てる:cmd > /dev/null 2>&1 (定番イディオム) ■ × 選択肢『標準入力を標準出力へ』は 0>&1 に近い話で、2>&1とは別物 LPIC-101 | 問32 シェル・リダイレクト 4 /6
4 実機でやって問題ないか コマンド例 + Ubuntu / RedHat 差分 $ ls /etc /nonexistent > out.txt 2>&1 $ cat out.txt $ ls /etc /nonexistent &> all.log $ ./build.sh > /dev/null 2>&1 & # 両方 out.txt へ # 正常もエラーも混在 # 短縮形(bash) # 静かにバックグラウンド実行 Ubuntu bash標準機能のため追加パッケージ不要。Ubuntu 24.04のデフォルトシェル(bash)で動作。dash( /bin/sh)では `&>` 短縮形は使えないので注意。 LPIC-101 | 問32 シェル・リダイレクト RedHat/RHEL RHEL/Rocky/Alma も bash が標準シェルなので同様 に動作。差分なし。ただし /bin/sh 指定のスクリプ トでは2>&1を使うこと(&>は非ポータブル)。 5 /6
★ 一言でまとめるよ! 2>&1 = エラー出力を標準出力に合流させる! うさうさ先生より 順番に注意!「 > file 2>&1 」はOK、「 2>&1 > file 」はNG。全部捨てるなら `>/dev/null 2>&1` を暗記しましょう。 LPIC-101 | 問32 シェル・リダイレクト 6/6