gabuLog

趣味と考え事をつらつらと

標準入出力の制御

標準入出力とは

入力をどこから受け入れるか、出力をどこに送るかを制御すること。

入出力制御には3種類のストリーム(データの流れ)がある。

全てのプロセス起動時に、上記の3つが生成される。

デフォルトでは標準入力は「キーボード」、標準出力と標準エラー出力は「コマンドを実行した端末」になっている。

これら3つを識別する為に、「ファイル記述子(ファイルディスクリプション)」というものが存在する。

どのファイルに繋げているかを識別するための記号。

ファイル記述子の説明
ファイル記述子 説明
0 標準入力のファイル記述子
1 標準出力のファイル記述子
2 標準エラー出力のファイル記述子

3以降は

これらを利用した「リダイレクション」によって入出力の切り替えをすることができる。

とりあえずは、ファイルへのアクセスにはファイル記述子で識別して、変えたい時はリダイレクションを使うんだなぐらいの理解。

標準出力、標準エラー出力の例

lsコマンド実行で存在するfile01と存在しないfileXを指定して実行した結果、fileXに対しては「ls:〜アクセスできません。そのようなファイルやディレクトリはありません」とエラーが表示され、file01に対しては名前が表示されている。

標準出力と標準エラー出力の表示例

標準出力と標準エラー出力の表示例

リダイレクト

リダイレクトは「」と「」を使って、格納先を決定する。

」は標準出力と標準エラー出力の上書き。「>>」のように2つ書くと、追記する。

」は標準入力。

標準出力・標準エラー出力のリダイレクト例

例1:lsコマンドの出力結果をfile01に格納。

リダイレクトの実行例

リダイレクトの実行例

例2:lsコマンドで存在しないファイルと存在するファイルを指定し、標準エラー出力のみをfile02に格納。

標準エラー出力のリダイレクト実行例

標準エラー出力のリダイレクト実行例

例3:lsコマンドで存在しないファイルと存在するファイルを指定し、標準出力と標準エラー出力をfile03に格納。

標準出力と標準エラー出力のリダイレクト実行例

標準出力と標準エラー出力のリダイレクト実行例

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

例1:file04の内容を標準入力としてコマンドを実行。

標準入力のリダイレクト実行例

標準入力のリダイレクトとパイプの実行例

パイプ

「|」を用いてコマンドの結果を受け取って別のコマンドを実行することができる。

teeコマンド

tee [オプション] [ファイル名]

teeコマンドのオプション
オプション 説明
-a ファイルに追記

teeコマンドは標準入力から読み込んだデータを標準出力とファイルの両方に出力する。

なので、画面にも表示されるし、ファイルにも格納される。

teeコマンドの実行例

teeコマンドの実行例

まとめ

標準入出力、リダイレクト、パイプはエラーの管理やプロセス間でのやり取りでよく使う項目なので、必ず覚えておきましょう。

コマンドを繋げて使いたい場合はパイプ、標準入力はキーボード入力したものををまとめて使いたい場合に使用ぐらいの理解をしました。