パイプ・リダイレクト・xargs完全攻略|2>&1 の読み方まで【LinuC 1.03.3】

LinuC対策

この記事はLinuC Level1 副主題1.03.3「ストリーム、パイプ、リダイレクトの使用」に対応した要点解説です。試験で問われる範囲に絞り、標準入出力のファイルディスクリプタ番号、リダイレクト記号の使い分け、パイプ/teexargs/ヒアドキュメントを整理しました。

📚 LinuC Level1 完全攻略マップ(全39サブ項目)へ戻る


目次

  1. この記事でできるようになること
  2. 3つの標準ストリームとファイルディスクリプタ
  3. 基本のリダイレクト < > >>
  4. 標準エラー出力のリダイレクト 2> 2>>
  5. 2>&11>&2&>:stdoutとstderrの統合
  6. /dev/nullで出力を捨てる
  7. パイプ | と行数カウントのイディオム
  8. tee:分岐して保存+パイプ
  9. xargs:標準入力を引数に変換
  10. ヒアドキュメント <<
  11. よくある質問
  12. まとめ
  13. 模擬問題にチャレンジ(ランダム出題)

1. この記事でできるようになること

  • ✅ 標準入力/標準出力/標準エラー出力のFD番号(0/1/2)
  • < > >> 2> 2>> の意味と使い分け
  • >1>>>1>>の等価関係
  • 2>&11>&2&>の意味、順序の重要性
  • ✅ パイプ|で標準出力を次のコマンドの標準入力に渡す
  • teeで画面+ファイルの同時出力、-aで追記
  • xargsで標準入力を引数に変換、find -print0+xargs -0
  • ✅ ヒアドキュメント<<の動作

2. 3つの標準ストリームとファイルディスクリプタ

Unix系OSでは、コマンドに対して3つの標準ストリームが自動的に開かれます。それぞれにファイルディスクリプタ(FD)番号が割り当てられており、リダイレクト記号で使う「2」や「1」はこの番号を指しています。

FD番号 名前 略称 デフォルト接続先
0 標準入力 stdin キーボード
1 標準出力 stdout 端末(画面)
2 標準エラー出力 stderr 端末(画面)

標準出力と標準エラー出力は見た目は同じ画面に出ますが、内部では別々のストリームです。通常の結果はstdout、エラーメッセージはstderrに流れる設計なので、エラーだけを捨てる・まとめる操作が可能になります。


3. 基本のリダイレクト < > >>

リダイレクトは、コマンドの入出力の接続先をキーボードや画面からファイルに切り替える仕組みです。

記号 意味
< file 標準入力をファイルから mail user < body.txt
> file 標準出力をファイルへ(上書き ls > list.txt
1> file >と同じ意味(FD=1を明示) ls 1> list.txt
>> file 標準出力をファイルへ(追記 date >> log.txt
1>> file >>と同じ意味(FD=1を明示) date 1>> log.txt

重要な等価関係として、>1>>>1>>です。FD番号「1」(標準出力)は省略可能で、省略時は標準出力とみなされます。試験では「同じ意味の組を選べ」という形で出題されるので、この対応を覚えておきます。

⚠️ >は上書き、>>は追記
>は既存の中身を消してから書き込みます。既存ログに追加したい場合は必ず>>を使います。試験でも「上書き保存」と「追記」の違いで選択肢を弁別させる問題が出ます。

<(入力リダイレクト)と>>(出力追記)は併用も可能です。たとえばcat < test1.txt >> tests.txtは、test1.txtの内容をcatの標準入力として読み込み、結果をtests.txtに追記します。


4. 標準エラー出力のリダイレクト 2> 2>>

標準エラー出力だけを別扱いしたいときは、リダイレクト記号の直前にFD番号2を付けます。

記号 意味
2> file 標準エラーをファイルへ(上書き)
2>> file 標準エラーをファイルへ(追記)
# エラーだけをファイルに(stdoutは端末に残る)
$ rm ./* 2> rm.log

# エラーを追記
$ make 2>> build_errors.log

たとえばrm ./*のエラーメッセージだけをrm.logに取りたい場合、正解はrm ./* 2> rm.logです。>だけではstdoutがリダイレクトされるだけで、エラーは画面に残ってしまいます。


5. 2>&11>&2&>:stdoutとstderrの統合

N>&Mという書き方で「FD Nを、FD Mと同じ先に向ける」という意味になります。間の&が「これはファイル名ではなく別のFDを指している」という合図です。

記号 意味
2>&1 標準エラー(2)を標準出力(1)と同じ先へ
1>&2 標準出力(1)を標準エラー(2)と同じ先へ
&> file stdoutとstderrを両方ファイルへ(bash短縮形)
# stdoutとstderrを両方out.logに保存(正しい順序)
$ sh test.sh > out.log 2>&1

# 同じ意味(bashの短縮形)
$ sh test.sh &> out.log

# エラーも含めて grep したい
$ cmd 2>&1 | grep error
⚠️ 書く順序を間違えると意図通りに動かない
正:cmd > out.log 2>&1(先にstdoutをファイルに向けてから、stderrを「今のstdoutと同じ先」=ファイルに向ける)
誤:cmd 2>&1 > out.log(先にstderrを「今のstdout=端末」に向け、その後でstdoutだけをファイルに切り替えるため、stderrは端末に残る)
リダイレクトは左から順に適用されると覚えます。
⚠️ 2>&12>1は全く別物
2>&1は「FD 2をFD 1と同じ先に」ですが、&を忘れた2>1は「FD 2を「1」という名前のファイルに書く」意味になります。&の有無でファイル名指定かFD指定かが切り替わる点に注意。

6. /dev/nullで出力を捨てる

/dev/nullは書き込んだデータをすべて捨てるスペシャルファイルです。不要な出力を消したいときに使います。

# 標準出力だけを捨てる(エラーは画面に残る)
$ cmd > /dev/null

# 標準エラーだけを捨てる(Permission deniedで画面が汚れるのを防ぐ定番)
$ find / -name "*.conf" 2> /dev/null

# stdoutもstderrも両方捨てる
$ cmd > /dev/null 2>&1

「stdoutを破棄してエラーは端末に残したい」場合はcmd > /dev/nullが正解。&> /dev/nullは両方捨ててしまうので要件に合いません。


7. パイプ | と行数カウントのイディオム

パイプ|左のコマンドの標準出力を、右のコマンドの標準入力につなぐ記号です。

# dmesg の出力を less でページ送り
$ dmesg | less

# cat の内容を wc -l に渡して行数を数える
$ cat file.txt | wc -l

# cut の結果をファイルに保存(画面には何も出ない)
$ cut -d : -f 1 /etc/passwd | head -3 > /tmp/u.txt

cat file.txt | wc -lの出力はファイルの行数です。wc -l file.txtと違ってファイル名は表示されない点が試験で問われます。

また、パイプを経由する場合でも最終段で>を使えば結果をファイルに保存できます。cut ... | head -3 > /tmp/u.txtの例では、画面には何も表示されず、出力は/tmp/u.txtに入ります。

⚠️ パイプはstdoutしか通らない
|は標準出力だけを次のコマンドに渡します。エラーメッセージも一緒に次段に送りたい場合はcmd 2>&1 | grep ...のようにstderrをstdoutに合流させる必要があります。「コマンド1 2>&1 | コマンド2」は「コマンド1のstdoutとstderrを両方コマンド2に渡す」動作になります。

7-1. コメント行をカウントする定番パターン

ファイルの中で「#で始まる行」を数える典型的な書き方は2通りあります。

# パターンA: grep -c (マッチした行数を直接表示)
$ grep -c '^#' file

# パターンB: grep の結果を wc -l に渡す
$ grep '^#' file | wc -l

どちらも同じ結果になります。-ccountの意味で、マッチした行数を出力するオプション。wc -l file(全行数)やcat file | grep '#'(件数ではなく行そのもの)と混同しないよう注意。


8. tee:分岐して保存+パイプ

名前の通りT字管を意味するteeは、標準入力を2方向に分岐させるコマンドです。ファイルに保存しつつ、同じ内容を標準出力にもそのまま流します。

# 画面に表示しつつ log.txt にも保存
$ dmesg | tee log.txt

# 追記モード(上書きしない)
$ command | tee -a out.txt

# 保存して後段にも流す
$ ls /etc | tee out.txt | less
オプション 意味
-a 追記モード(append)。既存内容を残して末尾に追加

teeのデフォルトは上書き。既存ログに追記したいときは-aを付けます。

⚠️ ファイル指定なしのteeは単なる素通し
echo ping-t | tee | catのようにファイル引数を省略した場合、teeはファイル分岐を行わず、受け取った入力をそのまま標準出力に流すだけになります。結果、catにはping-tが1回届き、画面にもping-tが1回表示されます。

9. xargs:標準入力を引数に変換

コマンドには「標準入力から読むタイプ」と「引数でファイル名を受け取るタイプ」の2種類があります。touchrmmvなどは後者で、パイプで直接ファイル名を流しても受け取ってくれません。

xargsは、前段の標準出力を次段の「引数」に変換するブリッジコマンドです。

# file.txt に書かれたファイル名を touch の引数として渡す
$ cat file.txt | xargs touch

# 例:file.txt の内容が "a.txt b.txt c.txt" なら
# → touch a.txt b.txt c.txt と同じ動作になる

# find とペアでスペース入りファイル名にも安全対応
$ find . -name "*.tmp" -print0 | xargs -0 rm
オプション 意味
-0 区切り文字をNUL(\0)にする。find -print0と対で使う
-I {} プレースホルダ。引数の位置を指定したいとき
-n N 1回の実行にN個ずつ引数を渡す
-p 実行前に確認プロンプトを表示
⚠️ スペースを含むファイル名には-print0-0の組
デフォルトのxargsはスペース・タブ・改行で引数を区切ります。ファイル名にスペースが含まれていると誤って分割されて別ファイルを消してしまう事故が起きます。find -print0はNULL文字区切りで出力し、xargs -0はNULLを区切りとして受け取るため、この組み合わせならどんな文字を含むファイル名でも安全です。

10. ヒアドキュメント <<

ヒアドキュメント(here document)は、指定した終了マーカーが行頭に単独で現れるまでの複数行を標準入力として渡すリダイレクトの仕組みです。

$ cat << world
> Hello world 1
> Hello world 2
> world
Hello world 1
Hello world 2

実行結果の解説:

  • << worldで「行頭にworldが単独で現れるまで」を標準入力として受け取る指定
  • >プロンプトは継続入力中のサイン(複数行入力の途中)
  • 3行目のworldで入力終了。ここまでの2行Hello world 1Hello world 2catの標準入力に渡され、そのまま出力される

マーカーは任意の単語で、EOFが慣習的に使われます。シェルスクリプトでの定型メッセージ出力や、mysqlなどへの複数行入力に使われます。

記号 動作
< 標準入力をファイルから取る
<< マーカー ヒアドキュメント(複数行を標準入力に)
<<< 文字列 ヒア文字列(1行の文字列を標準入力に)

11. よくある質問

Q. >1>>>1>>は同じ?

同じ意味です。FD番号「1」(標準出力)は省略可能で、省略すると標準出力の扱いになります。したがってdate > log.txtdate 1> log.txtはどちらも「date の結果でlog.txtを上書き」という同じ動作です。

Q. 2>&1 > file> file 2>&1はどちらが正しい?

後者が正解。リダイレクトは左から順に適用されるため、> fileを先に書くと「標準出力→file」、続く2>&1で「標準エラーも今の標準出力と同じ先(=file)」となり両方がfileに入ります。前者の順だとstderrは端末に残ります。

Q. パイプ|でエラーも次段に渡したい

パイプはstdoutしか通さないので、cmd 2>&1 | grep errorのように先にstderrをstdoutに合流させます。「コマンド1 2>&1 | コマンド2」で「両方を次に渡す」という定番パターンです。

Q. xargsでスペース入りファイル名が壊れる

デフォルトのスペース区切りが原因です。find ... -print0 | xargs -0でNULL区切りに切り替えれば、どんな文字を含むファイル名でも安全に扱えます。

Q. ヒアドキュメントとヒア文字列の違いは?

<<(ヒアドキュメント)は複数行をマーカーまで入力、<<<(ヒア文字列)は1行の文字列を直接標準入力に渡す仕組みです。


12. まとめ

  • 3つの標準ストリーム:0=stdin1=stdout2=stderr
  • 基本:<(入力)/>(出力、上書き)/>>(追記)
  • 等価関係:>1>>>1>>(FD=1は省略可)
  • エラー:2>(上書き)/2>>(追記)
  • 合流:2>&1(stderr→stdout)/1>&2(stdout→stderr)/&>(bash短縮形で両方)
  • 順序に注意:> file 2>&1は両方file、2>&1 > fileは逆効果
  • /dev/nullに書くと捨てる。> /dev/nullはstdoutのみ、> /dev/null 2>&1で両方
  • パイプ|はstdoutのみ通す。cat file | wc -lは行数を表示
  • grep -c '^#' filegrep '^#' file | wc -lは同じ結果(コメント行カウント)
  • tee=保存+パイプ、-aで追記、ファイル指定なしは素通し
  • xargs=stdinを次段の引数に変換。find -print0 | xargs -0で安全
  • << マーカーのヒアドキュメントはマーカー行で入力終了

📚 次の副主題:正規表現を使用したテキストファイルの検索(LinuC 1.03.4)


13. 模擬問題にチャレンジ(ランダム出題)

ここまでの内容を本試験に近い形で確認できます。問題数を選んで「出題スタート」を押すと、主題1.03.3の問題プール(28問)からランダムに出題されます。選択肢をクリック/タップすると、正誤と解説がその場で表示されます。

合格ライン目安:75%以上。もっと幅広く解きたい場合はLinuC 模擬問題ポータルから他の分野にも挑戦できます。


おすすめの教材


Linux教科書 LPICレベル1

Linux教科書 LPICレベル1 Version 5.0対応(あずき本)

LinuC/LPIC Level1 の定番参考書。出題範囲全体を網羅。


Amazonで見る →

【ウズカレ式】1週間でLinuxの基本操作と管理・運用スキルが学べる講座

累計80,000人以上受講。LinuC Level1(101+102)を1週間で網羅。パイプ・リダイレクトも実演でカバー。


Udemyで講座を見る →


関連記事

📚 LinuC Level1 完全攻略マップへ戻る
全39サブ項目のシラバス準拠マップから他の記事を探せます

Dockerの基礎を動画で体系的に学びませんか?

実務で使う基礎だけを3時間に凝縮。環境構築から丁寧に解説しています。

Udemy Docker入門講座 クーポン割引で講座を見る →

コメント

タイトルとURLをコピーしました