InfraAcademy

InfraAcademy Blog

【Linux】標準入力、標準出力、標準エラーとは?リダイレクトやパイプも初心者向けに解説

| #Linux #Linux初心者 #Linux入門

こんにちは、インフラエンジニアのryuです。

今回の記事では、Linuxの標準入力、標準出力、標準エラーについて解説します。どれもLinuxを操作するうえで欠かせない仕組みですが、最初は違いがわかりにくいですよね。

コマンドを実行すると、結果が画面に表示される。エラーが起きたときも画面にメッセージが出るため、どちらも同じ出力に見えるかもしれません。

しかし、Linuxの内部では、通常の実行結果とエラーメッセージは別の通り道を流れています。この違いがわかると、リダイレクトやパイプの動きも理解しやすくなります。

この記事では、標準入力・標準出力・標準エラーの基本から、>>>2>2>&1の使い方まで、実際のコマンドを交えて解説します。

Linuxの標準入力・標準出力・標準エラーとは?

Linuxでコマンドを実行するときは、プログラムとターミナルの間でデータがやり取りされます。そのデータの流れを理解するために、まずは3つの標準ストリームを整理しましょう。

種類 英語表記 ファイルディスクリプタ 通常の接続先
標準入力 stdin 0 キーボード
標準出力 stdout 1 ターミナル画面
標準エラー stderr 2 ターミナル画面

標準出力と標準エラーは、どちらも通常はターミナルに表示されます。そのため見た目だけでは区別しにくいのですが、Linux内部では別々に管理されています。

標準入力(stdin)とは?

標準入力とは、プログラムにデータを渡すための入力ストリームです。英語ではstandard inputといい、stdinと省略されます。

通常は、キーボードから入力した内容が標準入力になります。たとえば、readコマンドを実行すると、入力待ちの状態になります。

read name

続いてキーボードからryuと入力すると、その文字列が標準入力を通してreadコマンドへ渡されます。

ryu

コマンド引数と標準入力は別のもの

初心者のうちは、コマンドの後ろに書いたファイル名を標準入力だと思ってしまうことがあります。しかし、コマンド引数と標準入力は別の仕組みです。

たとえば、次のfile.txtは標準入力ではなく、viコマンドへ渡している引数です。

vi file.txt

このコマンドは、file.txtを編集対象として指定しています。viを開いた後にキーボードから入力する文字が、標準入力として扱われます。

同じように、cat file.txtfile.txtも引数です。一方、cat < file.txtでは、ファイルの中身を標準入力として渡しています。

標準出力(stdout)とは?

標準出力とは、プログラムの正常な実行結果を送り出すためのストリームです。英語ではstandard outputといい、stdoutと省略されます。

通常、標準出力はターミナル画面につながっています。lsコマンドで表示されるファイル一覧や、echoコマンドで表示される文字列などが標準出力です。

echo "Linuxを学習中です"

実行すると、次の内容がターミナルに表示されます。

Linuxを学習中です

標準エラー(stderr)とは?

標準エラーとは、プログラムがエラーや警告を出力するためのストリームです。英語ではstandard errorといい、stderrと省略されます。

標準エラーも、通常はターミナル画面に表示されます。ただし、標準出力とは異なる通り道であり、ファイルディスクリプタには2が割り当てられています。

ls /notfound

存在しないディレクトリを指定すると、エラーメッセージが表示されます。このメッセージは標準出力ではなく、標準エラーへ送られています。

正常な結果とエラーを分けることで、成功したデータだけをファイルへ保存したり、エラーだけをログへ記録したりできます。Linuxの運用では、この使い分けがとても重要です。

標準入力・標準出力・標準エラーの具体的な使い方

ここからは、実際のコマンドを使って3つのストリームを確認します。画面に何が表示され、どの通り道を流れているのかを意識してみましょう。

標準入力の実例

標準入力は、プログラムが処理するデータを受け取るために使われます。キーボード入力だけでなく、ファイルや別のコマンドの実行結果も入力にできます。

まず、readコマンドで名前を受け取り、その内容を表示してみます。

read name
echo "こんにちは、${name}さん"

read nameを実行した後に名前を入力すると、その内容が変数nameへ保存されます。キーボードから入力したデータが標準入力として処理された例です。

ファイルの内容を標準入力へ渡す場合は、<を使います。

wc -l < access.log

wc -lは行数を数えるコマンドです。この例では、access.logの内容を標準入力から受け取り、ファイル名を表示せずに行数だけを出力します。

標準出力の実例

標準出力は通常ターミナル上に結果を表示することです。

以下は、lsコマンドを使ってカレントディレクトリのファイルとディレクトリを表示する例です。

ls

コマンドを実行すると、以下のようにターミナルにコマンドの結果が標準出力として表示されます。

標準出力の結果

このコマンドは、カレントディレクトリの内容を標準出力に表示します。もし別のファイルに出力したい場合は、リダイレクトを使って次のようにコマンドを実行します。

ls > file.txt

>を使うと、標準出力の接続先がターミナルからfile.txtへ切り替わります。そのため、画面には一覧が表示されず、実行結果がファイルへ保存されます。

>はファイルを上書きします。すでにfile.txtが存在する場合は元の内容が消えるため、実行前にファイル名を確認しましょう。

リダイレクトの仕組みは、こちらの記事で詳しく解説しています。

【関連記事】Linuxのコマンドラインで使う>の意味とは?リダイレクト演算子の使い方

標準エラーの実例

標準エラーはプログラムがエラーや警告メッセージを出力するためのストリームです。

例えば、存在しないファイルをcatコマンドで表示しようとすると、標準エラーにエラーメッセージが表示されます。

cat nofile.txt

上記のコマンドを実行すると、nofile.txtというファイルが存在しないため、エラーメッセージが標準エラーに表示されます

標準エラーの結果

エラーメッセージをファイルに保存したい場合は、次のようにリダイレクトを使って標準エラーをファイルに出力します。

cat nofile.txt 2> error.log

2>2は、標準エラーのファイルディスクリプタです。この指定により、通常の実行結果ではなく、エラーメッセージだけがerror.logへ保存されます。

catコマンドの基本から確認したい方は、次の記事も参考にしてください。

【関連記事】Linuxのcatコマンドの使い方を解説!ファイルの中身を確認しよう

リダイレクトで出力先を変更する

標準入力や標準出力を理解すると、リダイレクトの記号も暗記ではなく仕組みで判断できるようになります。よく使う書き方を表で整理しましょう。

記号 意味 使用例
< ファイルを標準入力へ渡す sort < names.txt
> 標準出力をファイルへ上書きする ls > files.txt
>> 標準出力をファイル末尾へ追記する date >> history.log
2> 標準エラーをファイルへ上書きする cat nofile 2> error.log
2>> 標準エラーをファイル末尾へ追記する command 2>> error.log
2>&1 標準エラーを標準出力と同じ場所へ送る command > all.log 2>&1

記号だけを見ると複雑に感じますが、1は標準出力、2は標準エラーです。どの通り道を、どこへつなぎ替えるのかを読むと理解しやすくなります。

標準出力を上書き保存する

コマンドの正常な実行結果をファイルへ保存するには、>を使います。

ps aux > process.txt

このコマンドでは、実行中のプロセス一覧がprocess.txtへ保存されます。ファイルが存在しない場合は新しく作成され、存在する場合は上書きされます。

エンジニア歴10年ほどの実務でも、>を使う前には保存先を確認するようにしています。調査結果を残すつもりで、以前のログを上書きしてしまうミスは意外と起こりやすいからです。

標準出力を追記する

既存の内容を残したまま、ファイルの末尾へ追加する場合は>>を使います。

date >> operation.log

このコマンドを繰り返すと、実行した時刻がoperation.logの末尾へ追加されます。簡単な作業履歴を残したいときにも使えます。

標準出力と標準エラーを別々に保存する

正常な実行結果とエラーを分けて保存したい場合は、それぞれにファイルを指定します。

find / -name "*.conf" > result.log 2> error.log

検索できたファイルはresult.logへ保存され、権限不足などのエラーはerror.logへ保存されます。画面上では混ざって見える情報を、用途別に分離できます。

サーバー調査では、正常な結果とエラーを分けて残すことがよくあります。後から確認するときに、どの処理が成功し、どこで問題が起きたのかを追いやすくなるためです。

標準出力と標準エラーを同じファイルへ保存する

正常な結果とエラーをまとめて保存したい場合は、次のように実行します。

find / -name "*.conf" > all.log 2>&1

最初に標準出力をall.logへ送り、続く2>&1で標準エラーを標準出力と同じ場所へ送っています。順番にも意味があるため、ひとまとまりで覚えましょう。

不要な出力を捨てる

表示も保存も不要な出力は、/dev/nullへ送れます。/dev/nullは、書き込んだデータが破棄される特別なファイルです。

command > /dev/null

この例では標準出力だけを捨てます。標準エラーも含めてすべて捨てる場合は、次のようにします。

command > /dev/null 2>&1

エラーまで捨てると、問題が起きても原因を確認できません。定期処理やシェルスクリプトでは、必要なエラーをログへ残す設計にしましょう。

パイプで標準出力を次のコマンドへ渡す

パイプは、あるコマンドの標準出力を、次のコマンドの標準入力へ渡す仕組みです。縦線の|を使います。

ls -l | grep ".log"

この例では、ls -lの標準出力がgrepの標準入力へ渡されます。grepは受け取った一覧から、.logを含む行だけを表示します。

grepコマンドの使い方は、次の記事で詳しく解説しています。

【関連記事】Linuxのgrepコマンドで文字を検索する方法を初心者向けに解説

パイプに標準エラーはそのまま流れない

ここは、初心者がつまずきやすいポイントです。通常のパイプで次のコマンドへ渡されるのは、標準出力だけです。

find /root -name "*.log" | grep error

findで権限エラーが発生した場合、そのメッセージは標準エラーなので、通常はgrepへ渡されません。ターミナルへ直接表示されます。

標準エラーもパイプへ流したい場合は、標準エラーを標準出力へまとめてから渡します。

find /root -name "*.log" 2>&1 | grep "Permission denied"

このように、標準出力と標準エラーの違いがわかると、パイプの検索結果にエラーが含まれない理由も説明できるようになります。

実務でよく使う標準ストリームの例

仕組みを理解したところで、実際のサーバー運用でよく使う形を確認しましょう。最初からすべて覚える必要はなく、必要なときに見返しながら使えば大丈夫です。

ログからエラーを検索して保存する

アプリケーションログからERRORを含む行を抽出し、別のファイルへ保存します。

grep "ERROR" application.log > error-only.log

grepが検索した結果は標準出力へ送られます。その標準出力を>error-only.logへ保存しています。

エラーだけを画面から消す

アクセス権限のないディレクトリが多く、エラー表示だけを非表示にしたい場合があります。

find / -name "httpd.conf" 2> /dev/null

検索結果は標準出力として画面に表示され、権限エラーは/dev/nullへ送られます。ただし、調査に必要なエラーまで消していないかは確認してください。

標準入力・標準出力でよくある疑問

最後に、初心者から質問されることが多い点を整理します。ここまでの内容を別の角度から確認してみましょう。

画面に表示されたものはすべて標準出力ですか?

いいえ。ターミナルには標準出力と標準エラーの両方が表示されるため、画面に出たというだけでは判断できません。

確認したい場合は、標準出力と標準エラーを別々のファイルへリダイレクトします。

command > stdout.log 2> stderr.log

stdout.logに入ったものが標準出力、stderr.logに入ったものが標準エラーです。

2>の2はファイル名ですか?

ファイル名ではありません。2は標準エラーを表すファイルディスクリプタです。

cat nofile.txt 2> error.log

この書き方では、標準エラーの出力先をerror.logへ変更しています。2>の間に空白を入れないようにしましょう。

>と>>はどちらを使えばよいですか?

内容を入れ替えてよい場合は>、既存の内容を残して追加したい場合は>>を使います。迷ったときは、対象ファイルの中身を確認してから実行してください。

まとめ

今回の記事では、Linuxの標準入力、標準出力、標準エラーについて解説しました。

標準入力はプログラムがデータを受け取る通り道で、標準出力は正常な実行結果、標準エラーはエラーや警告を送り出す通り道です。それぞれには012のファイルディスクリプタが割り当てられています。

この仕組みが理解できると、>2>を使った保存だけでなく、パイプでコマンドをつなぐ処理も読みやすくなります。Linuxでは頻繁に使うため、実際にコマンドを打ちながら動きを確認してみてください。

さらにLinuxの学習をしたい人に向けて、InfraAcademyというインフラ学習サービスのご紹介です。

Linuxの実践的な内容を学習したい、コマンドを打ちながらLinuxを学習したい。

そのようなご要望にお応えして、Linuxやネットワークを学習できるサイトInfraAcademyをリリースしました。

入門から中級まで、IT初心者でも実際に操作しながら学習を進められます。

↓InfraAcademyの講座の一部です。

Linuxの学習サイトInfraAcademy 上記以外にも、DNSサーバーの構築方法や、Dockerの設定方法などさまざまな講座があります。

インフラエンジニアに必要な知識を、基礎から順番に学習できます。

InfraAcademyでLinuxの学習を始める

Next Action

記事で読んだ内容を、講座で実装してみましょう

InfraAcademyでは、ブラウザ上でLinuxやネットワークの実践環境を使いながら学習できます。無料で始められる講座から、学習の流れを試せます。

この記事を書いた人

ryu

InfraAcademy運営 / エンジニア

エンジニア歴10年。Linux、ネットワーク、クラウドを中心に、実務で役立つインフラ技術を初心者にもわかりやすく解説しています。

X: @ryu63614894

Related

関連記事

ブログ一覧へ

Roadmap

まずはこの4講座から

ログインすれば無料で始められる講座です。気になったテーマから手を動かして学べます。

講座一覧を見る