標準入出力

標準入出力とは

標準入出力 (Standard Input/Output) は、コンピュータシステムにおいて重要な概念です。プログラムやシステムがデータの受け渡しを行うための基本的なメカニズムです。

標準入力 (stdin)

標準入力は、プログラムやコマンドがデータを受け取るための仕組みです。通常、キーボードからの入力やファイルからの読み込みがこの入力源として使われます。

  • キーボード入力: ユーザーがコマンドラインでキーボードから直接入力することができます。例えば、対話型のプログラムやシェルでのコマンド入力などが該当します。
  • ファイルからの読み込み: ファイルからのデータをプログラムに供給することができます。この場合、リダイレクションを使ってファイルを指定することが一般的です。

標準出力 (stdout)

標準出力は、プログラムやコマンドが処理結果やメッセージを出力するための方法です。通常、画面に表示されるテキストやファイルへの書き込みがこの出力先として使われます。

  • 画面への表示: プログラムが処理結果やメッセージをターミナル上に表示します。これにより、ユーザーは実行中のプログラムの進行状況や結果を確認できます。
  • ファイルへの書き込み: プログラムが処理結果をファイルに書き込むことができます。リダイレクションを使って出力先のファイルを指定することが可能です。

標準エラー出力 (stderr)

標準エラー出力は、プログラムやコマンドがエラーメッセージや警告を出力するためのチャネルです。通常、標準出力とは別の出力先として使われます。

  • エラーメッセージの表示: プログラムがエラーや警告を出力する際に使用されます。これにより、ユーザーは問題が発生した際にそれを認識し、対処することができます。

標準入力の使い方

コマンドラインからの入力

ユーザーがターミナルでコマンドを実行する際に、コマンドライン引数の代わりに標準入力からデータを取得することができます。例えば、catコマンドで標準入力からファイルの内容を表示することができます。
以下の例の場合test_inputの内容が標準入力としてcatに渡されます。

# 作業用ディレクトリの作成
mkdir ~/work/

# カレントディレクトリの変更
cd ~/work/

# テスト用のファイルを作成
echo '標準入力のテスト' > test_input

test_input の内容をcatコマンドに渡す。

cat < test_input

パイプによる他のプログラムからの入力

他のプログラムの出力を標準入力として受け取ることができます。これにより、複数のコマンドを連結してデータを処理することができます。
以下の例の場合input.txtの内容が標準入力としてcatに渡され、その結果をgrepの標準入力として渡されます。

cat < test_input | grep 'テスト'

標準出力の使い方

コマンドの出力結果の表示

最も基本的な標準出力の利用方法は、コマンドの実行結果を端末に表示することです。
この例では、echo コマンドが “Hello, World!” を標準出力に書き込み、端末に表示します。

echo "Hello, World!"

ファイルへの出力

リダイレクション (>) を使用すると、標準出力をファイルに書き込むことができます。
このコマンドは、”Hello, World!” を output.txt ファイルに書き込みます。既存のファイルがある場合、その内容は上書きされます。

echo "Hello, World!" > output.txt

output.txtにechoで指定した文字が書き込まれていることを確認

cat output.txt

ファイルへの追記

リダイレクション (>>) を使用すると、標準出力をファイルに追記することができます。
このコマンドは、output.txt ファイルの末尾に “Hello, again!” を追加します。

echo "Hello, again!" >> output.txt

output.txt ファイルの末尾に “Hello, again!”が追記されたことを確認できます。

cat output.txt

パイプを通じた他のコマンドへの出力

パイプ (|) を使用すると、あるコマンドの標準出力を別のコマンドの標準入力として渡すことができます。この例では、echo コマンドの出力を tr コマンドに渡し、小文字を大文字に変換しています。

echo "Hello, World!" | tr '[:lower:]' '[:upper:]'

標準エラー出力の使い方

標準エラー出力は、プログラムが実行中に発生するエラーや警告をユーザーに伝えるために使用されます。たとえば、ファイルの読み込みエラーやコマンドの不正な引数に関するエラーなどが含まれます。
このコマンドは存在しないディレクトリ /sttderr_dir をリストしようとしますが、エラーメッセージが標準エラー出力に表示されます。

ls /sttderr_dir

標準エラー出力のリダイレクション

エラーメッセージをファイルにリダイレクト

標準エラー出力をファイルにリダイレクトするには「2>」のように記載します。

ls /sttderr_dir 2> error.log

error.logにエラーメッセージが書き込まれていることを確認できます。

cat error.log

標準出力と標準エラー出力を別々のファイルにリダイレクト

以下の例では、標準出力を output.log に、標準エラー出力を error.log にリダイレクトします。

テスト用のファイルを作成します。

touch test1

ls で存在するファイルと存在しないファイルを指定する

ls test1 test2 > output.log 2> error.log

output.logには標準出力の内容が記載されていました。

cat output.log

error.logには標準エラー出力のメッセージが記載されていました。

cat error.log

標準出力と標準エラー出力を同じファイルにリダイレクト

以下の例では、標準出力と標準エラー出力の両方を all.log ファイルにリダイレクトします。

ls で存在するファイルと存在しないファイルを指定し、標準出力と標準エラー出力をリダイレクトします。

ls test1 test2 > all.log 2>&1

all.logに標準出力と標準エラー出力の内容が記載されている

cat all.log

標準エラー出力を利用したエラーメッセージの表示方法

標準エラー出力を利用して、プログラムのエラーメッセージを表示することが一般的です。たとえば、シェルスクリプトやプログラム内でエラーメッセージを表示する方法を以下に示します。
このスクリプトは、指定されたファイルが存在しない場合にエラーメッセージを標準エラー出力に表示します。

cat <<EOS > check_file.sh
#!/bin/bash

if [ ! -f "\$1" ]; then
    echo "ファイル\$1は存在しません" >&2
    exit 1
fi

echo "ファイル\$1は存在します"
EOS

スクリプトに実行権限を付与します。

chmod 744 check_file.sh

引数に実際に存在するtest1を指定した結果

./check_file.sh test1

引数に存在しないtest2を指定した結果

./check_file.sh test2

エラーログファイルへの記録

エラーメッセージをログファイルに記録することで、システムの監視やトラブルシューティングが容易になります。このコマンドは、check_file.sh のエラーメッセージを error.log に追記します。

今回の例ではエラーのみerror.logにリダイレクトしてみます。

まずは存在するファイルを指定すると標準出力として処理されメッセージが表示されました。

./check_file.sh test1 2>> error.log

次に存在しないtest2を指定した場合、error.logにリダイレクトされ、メッセージが表示されません。

./check_file.sh test2 2>> error.log

error.logにはエラーメッセージが追記されています

cat error.log

標準出力とエラー出力をリダイレクト

ファイルが存在する場合

./check_file.sh test1 >> output.log 2>&1

ファイルが存在しない場合

./check_file.sh test2 >> output.log 2>&1

output.logにどちらのケースも追記されている

cat output.log

コメント

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