【Bash講座 第4回】コマンドの結果を保存したい!Linuxの「配管工事」を学ぼう
こんにちは!「リナックス先生」です。
前回は、セキュリティの要である「パーミッション(権限)」について学びました。
コウ君、その後サーバーいじりは順調?
先生!コマンド操作にもだいぶ慣れてきたんですが、悩みがあります。
エラーが出た時の画面とか、長いコマンドの結果とか、その場限りで消えちゃいますよね?
後で見直すために保存したいんですけど、画面の文字をマウスで選択してメモ帳にコピペするしかないんですか?
ふふ、コピペなんてアナログなことはしなくていいのよ。
Linuxには「リダイレクト(切り替え)」と「パイプ(連結)」という超強力な機能があるの。
これを使いこなせば、コマンドの結果をファイルに保存したり、別のコマンドに渡して加工したり、まるでパズルのように自由自在にデータを扱えるようになるわ!
第4回となる今回は、Linux操作の楽しさが一気に広がる「入出力の制御」について解説します。
これができると、「ただのオペレーター」から「エンジニア」へとレベルアップできますよ。
本講座のカリキュラム(全12回)
AlmaLinux 9 (RHEL 9互換) 環境を前提に、基礎から応用までステップバイステップで進めます。
- Bash入門編:シェルとカーネルの関係、CUIの哲学、環境構築
- ファイル操作の極意:絶対パス・相対パスと「ワイルドカード」の魔術
- 権限(パーミッション)とユーザー:chmod, chown, sudoの仕組みを完全理解
- 【今回】入出力リダイレクトとパイプ:Linuxの真骨頂!コマンド同士を連携させる技術
- テキスト処理の基本:cat, head, tail, less…ファイルの中身を覗く道具たち
- 最強のエディタ「Vi/Vim」入門:サーバー内でテキストを編集する必須スキル
- シェルスクリプトの第一歩:ファイルにまとめて自動実行!変数と引数の基礎
- 条件分岐(if文):サーバーの状態を見て「判断」できるスクリプトを作る
- 繰り返し処理(for/while文):面倒な単純作業を1秒で終わらせるループ処理
- テキスト処理の応用:grep, sed, awk…ログ解析の達人になるための三種の神器
- 実践・自動化スクリプト:バックアップと監視を自動化し、Cronで定期実行する
- 総仕上げ:自作スクリプトの集大成と、エンジニアとしての歩き方
1. そもそも「標準入出力」とは?
コマンド操作をしていると、「キーボードで打った文字がコマンドに伝わり、結果が画面に出る」のが当たり前に思えますが、実はこれ、Linux(シェル)が裏で気を利かせてくれているんです。
このデータの流れを制御する概念を「標準入出力(Standard I/O)」と呼びます。
データの3つの通り道
Linuxのコマンドには、必ず3つの「出入り口(ストリーム)」が最初から用意されています。
それぞれに「ファイルディスクリプタ」と呼ばれる番号が割り振られています。
| 名前 | 番号 | 普段の役割(デフォルトの接続先) |
|---|---|---|
| 標準入力 (stdin) |
0 | キーボードからの入力を受け取る入り口 |
| 標準出力 (stdout) |
1 | 成功した結果を画面(ディスプレイ)に表示する出口 |
| 標準エラー出力 (stderr) |
2 | エラーメッセージを画面(ディスプレイ)に表示する出口 |
なるほど…。「成功した結果(1番)」と「エラー(2番)」は、出口が別々なんですね!
でも、普段はどっちも同じ画面に出ているから気が付きませんでした。
普段は「画面」に向いているこの出入り口を、「ファイル」や「別のコマンド」に切り替えること。
それが今回のテーマである「リダイレクト」と「パイプ」なのです。
2. 結果をファイルに保存!リダイレクト「>」
画面に出るはずの「標準出力(1番)」を、ファイルの方向に向け直す(Redirect)機能です。
数学の「大なり記号」を使います。
(1) 上書き保存 >
コマンドの実行結果をファイルに書き込みます。
ファイルがなければ新規作成し、既にあれば中身を空にして上書きします(古い内容は消えます)。
# "Hello" と画面に出す代わりに、msg.txt に書き込む [root@localhost ~]# echo "Hello World" > msg.txt # 画面には何も表示されない(出力先がファイルに変わったから) # 中身を確認してみる(catコマンドは次回詳しく解説します) [root@localhost ~]# cat msg.txt Hello World
(2) 追記保存 >>
上書きせず、ファイルの末尾に追加します。
ログ(記録)を残したい時や、設定ファイルの最後に一行足したい時はこちらを使います。
初心者は > と >> を間違えて、大事なファイルを消してしまう事故が多いので注意しましょう。
# msg.txt の続きに書き込む [root@localhost ~]# echo "Second Line" >> msg.txt [root@localhost ~]# cat msg.txt Hello World Second Line
これ便利ですね!ls -l > file_list.txt ってやれば、今のディレクトリにあるファイル一覧をテキストとして保存できるんですね!
3. エラーメッセージも保存したい!「2>」
実は、普通のリダイレクト > では、エラーメッセージは保存されません。
エラーは「標準出力(1番)」ではなく「標準エラー出力(2番)」という別の出口から出ているからです。
エラーだけを保存する
番号を指定してリダイレクトします。
# 存在しないファイルを指定してエラーを起こす # 普通のリダイレクトだと、エラーは画面に出てしまう [root@localhost ~]# ls not_exist_file > log.txt ls: cannot access 'not_exist_file': No such file or directory # log.txt は空っぽのまま [root@localhost ~]# cat log.txt (何もなし) # 2番(エラー)を指定してリダイレクトする [root@localhost ~]# ls not_exist_file 2> error_log.txt # (画面には何も出ない) [root@localhost ~]# cat error_log.txt ls: cannot access 'not_exist_file': No such file or directory
【プロの技】成功も失敗も全部保存する 2>&1
「正常な結果」も「エラー」も、全部まとめて一つのファイルに入れたい。
自動化スクリプトを作る際、最もよく使われるのがこの呪文です。
# 「1番(正常)」をファイルに向け、「2番(エラー)」を「1番の行き先(&1)」と同じ場所へ流す [root@localhost ~]# command > all_log.txt 2>&1
この 2>&1 という記法は、Cron設定などで頻出するので、「エラーも標準出力に合流させるおまじない」として覚えておきましょう。
4. コマンド同士を連結!パイプライン「|」
リダイレクトは「ファイル」への保存でしたが、「パイプ(|)」はコマンドとコマンドを繋ぐ機能です。
「前のコマンドの出力結果」を、「次のコマンドの入力」として渡します。
キーボードの Shift + ¥ (またはバックスラッシュ) で入力できる縦棒です。
これがLinuxの真骨頂よ。
Linuxには「一つのコマンドは一つのことだけをうまくやる」という哲学(UNIX哲学)があるの。
「表示するだけのコマンド」と「検索するだけのコマンド」をパイプで繋げば、「表示結果から検索する」という複雑な機能が実現できる。
小さな道具を組み合わせて大きな仕事をする、これがエンジニアの腕の見せ所よ。
実用例1:大量の結果を少しずつ見る (ls | less)
ls -l /etc など、結果が大量すぎて画面が流れてしまう時、less コマンド(ページ送り機能)に渡します。
# ls の結果を less に渡す [root@localhost ~]# ls -l /etc | less
※ less 画面では、スペースキーで次ページ、b で戻る、q キーで終了できます。
実用例2:履歴からコマンドを探す (history | grep)
history コマンド(過去の履歴表示)と、grep コマンド(文字検索)を組み合わせます。
「さっき打ったあの長いコマンド、なんだっけ?」という時に最強です。
# 履歴の中から "http" という文字が含まれる行だけ表示 [root@localhost ~]# history | grep http 105 dnf install httpd 106 systemctl start httpd 112 vi /etc/httpd/conf/httpd.conf
実用例3:プロセスの数を数える (ps | wc)
ps(プロセス表示)と wc -l(行数カウント)を組み合わせます。
# 今動いているプロセスの行数を数える [root@localhost ~]# ps aux | wc -l 125
5. 便利な応用テクニック
ブラックホールへ捨てる /dev/null
Linuxには、「投げ込まれたデータを全て消滅させる」特殊なファイルが存在します。
それが /dev/null です。
「エラーメッセージが出ると邪魔だから消したい」という場合に重宝します。
# エラーメッセージを闇に葬る(画面にも出ないし、ファイルにも残らない) [root@localhost ~]# command 2> /dev/null
画面に出しながらファイルにも保存 tee
リダイレクト > を使うと画面に何も出なくなって不安…という時は、tee(ティー)コマンドを使います。
T字路の配管のように、画面とファイルの両方に出力します。
# 画面に "Success" と表示しつつ、log.txt にも保存 [root@localhost ~]# echo "Success" | tee log.txt Success [root@localhost ~]# cat log.txt Success
次回予告:ファイルの中身を覗いてみよう
第4回は、入出力を自在に操る「リダイレクト」と「パイプ」について解説しました。command > file や cmd1 | cmd2 という書き方は、エンジニアなら息をするように使います。
これを覚えると、「自分、Linux使ってるな~」という実感が湧いてきますよね。
次回は、今回少し登場した cat や less 、head tail といった「テキストファイルの中身を見るコマンド」たちを総特集します。
サーバー管理で最も重要な仕事の一つ、「ログ解析」の第一歩となる重要な回です。お楽しみに!
次回までに、ls -l /etc > my_file_list.txt を実行して、ちゃんとファイルが保存されているか確認してみてね。
Linuxの配管工事を楽しんで!
▼本講座推奨!AlmaLinux 9がすぐ使えるVPS



コメント