Linuxの標準入力・出力・エラーの操作入門 – リダイレクトとパイプの使い方

この記事では、Linuxでよく使われる標準入力・標準出力・標準エラーの操作方法について学びます。
これらの操作は、リダイレクトやパイプを使って効率的にコマンドの結果を処理するために重要な技術です。
実際にコマンドを入力して確認できる具体例を交えながら進めていきます。

準備:テスト用ファイルを作成

まず、学習に使うテスト用のファイルを作成します。
以下のコマンドを打ち込みます。

echo "これはテストです" > testfile.txt
echo "エラーメッセージ" > errorfile.txt

これで、testfile.txtという内容が「これはテストです」のファイルと、
errorfile.txtという内容が「エラーメッセージ」のファイルが作成されます。

目次

標準出力のリダイレクト >

通常、コマンドの実行結果(標準出力)はターミナルに表示されますが、
>を使うことで、その結果をファイルに保存することができます。

echo "Hello, World!" > output.txt

output.txtという新しいファイルが作成され、その中に「Hello, World!」が書き込まれます。
ファイルの中身を確認してみましょう。

cat output.txt

出力例:

Hello, World!

注意:もし既にoutput.txtが存在している場合、上書きされてしまうので注意してください。

標準出力を追記 >>

上書きではなく、既存のファイルに新しい内容を追記したい場合は、>>を使います。

echo "追記された行です" >> output.txt

これで、output.txtに「追記された行です」が追加されます。
再度ファイルの中身を確認しましょう。

cat output.txt

出力例:

Hello, World!

追記された行です

標準入力のリダイレクト <

<は、コマンドがファイルの内容を入力として受け取るときに使います。
例えば、catコマンドにファイルを渡す代わりに、リダイレクトを使ってみましょう。

cat < testfile.txt

これは、cat testfile.txtと同じ結果になります。

出力例:

これはテストです

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

コマンドがエラーを出した際、そのメッセージを標準エラー出力と呼ばれる別のストリームで処理します。
2>を使って、そのエラー出力をファイルに保存できます。

例えば、存在しないファイルをcatしようとするとエラーが出ます。

cat non_existent_file 2> error.log

error.logファイルを確認して、エラーメッセージが保存されているか確認しましょう。

cat error.log

出力例:

cat: non_existent_file: そのようなファイルやディレクトリはありません

パイプ |

パイプ(|)は、あるコマンドの出力を次のコマンドの入力として使う機能です。
これにより、複数のコマンドを組み合わせて処理できます。

例:lsとgrepを組み合わせる

ディレクトリ内のファイル一覧を表示し、
その中から特定の文字列(txt)を含むファイル名を検索します。

ls | grep "txt"

出力例:

errorfile.txt
testfile.txt

この例では、ディレクトリ内のtxtを含むファイルをリストアップしています。

tee:出力を保存しつつ画面にも表示

teeコマンドは、パイプで渡された出力をファイルに保存しながら、
同時に画面にも表示することができます。

echo "テストメッセージ" | tee saved_output.txt

このコマンドは「テストメッセージ」を画面に表示しつつ、
saved_output.txtというファイルに保存します。ファイルを確認してみましょう。

cat saved_output.txt

出力例:

テストメッセージ

練習問題

①testfile.txtの内容を標準出力で確認し、その結果をoutput.logというファイルに保存してください。
②testfile.txtに新しい行「追加のテスト」を追記してください。
③存在しないファイルをcatし、そのエラーメッセージをerror_output.logに保存してください。
④lsとgrepを使って、特定の拡張子を持つファイルを検索してください。

答え

cat testfile.txt > tee output.log

echo “追加のテスト” >> testfile.txt

cat abcde.txt 2> error_output.log

ls | grep ‘/.log$’ ※\. は「.」をリテラルとして扱い、$ は行末を表します。

    目次