目標

標準入力・標準出力・標準エラー出力について概要を理解する。
「パイプ」と「リダイレクト」について概要と利用方法を理解する。

標準入出力とファイルディスクリプタの概要

標準入力・標準出力・標準エラー出力の概要

標準入力・標準出力・標準エラー出力とは

Linuxのコマンドは、ユーザーがキーボードから直接入力するか、スクリプトファイルに記述されたものが読み込まれることで、シェル(例: bash)に渡されます。シェルはこれらのコマンドを解析し、システムコールを通じてカーネルにプロセスの実行を依頼します。

コマンドの実行後、出力結果は標準出力や標準エラー出力を通じて、モニターやファイルなどの外部に出力されます。実際の出力処理はコマンド(プロセス)自身が行い、その出力先の制御やデバイスとのやりとりはカーネルが担当します。

この入力から出力までの流れをストリームといいます。

コマンドは、この受け渡しに対して常に「ひとつの入力口」と「ふたつの出力口」を用いて実行されます。これらをそれぞれ「標準入力」「標準出力「標準エラー出力」といいます。

  1. 標準入力…コマンドが入力を受け取るためのインターフェースでキーボードが繋がれています。
  2. 標準出力…コマンドの実行結果を受け渡すインターフェースでモニターが繋がれています。
  3. 標準エラー出力…コマンドの実行結果としてエラーメッセージを受け渡すインターフェースでこちらもモニターが繋がれています。

なぜ、出力には「標準出力」と「標準エラー出力」があるのか。

コマンド処理には「処理が完全に行われる」パターンと「処理が途中で止まってしまう」パターンの2つがあります。2つのパターンがあるということはプログラム的にも処理を別々に行わせる必要があることになります。

お使いで例えると、子供に「牛乳と卵を買ってきて」と頼んだとします。

この処理は、
1.買い物袋とお金を持ってスーパーに行く。
2.牛乳と卵を買う。
3.家に帰って牛乳と卵を冷蔵庫に入れる。
4.お使いが終わったことを連絡する
とします。

この時「牛乳と卵を買えた場合は」は冷蔵庫には牛乳と卵が入っていることになります。(標準出力)

ですが、もし卵がスーパーになかった場合は、いくつかの結果が考えられます。例えば、「子供がスーパーから帰ってこない。」「子供は帰ってきたが冷蔵庫には卵がない」「まだ連絡がない」など。このような時に、エラー専用の処理とその結果を出力させてあげる準備をしていれば「なぜ?」ということにはならないことになります。このエラー結果を出力させるのが「標準エラー出力」となります。

ファイルディスクリプタの概要

ファイルディスクリプタとは

ファイルディスクリプタはファイルを識別するための番号(目印)のことを言います。この番号のうち、特別なファイルを示すものがあり、「0」「1」「2」があります。これらの番号は「0:標準入力」「1:標準出力」「2:標準エラー出力」と決まっています。

標準入力、標準出力、標準エラー出力は「仮想的なファイル」として認識されていて、入力や出力を行うことができます。

「パイプ」と「リダイレクト」

「パイプ」の概要と利用方法

「パイプ」とは

コマンドの処理結果を別のコマンド処理へ渡して利用することができます。このコマンド処理を渡す機能を「パイプ」といい「Shift + \」で入力できます。(実際の記号「|」)

「パイプ」の利用方法

実際の「パイプの利用」を行ってみます。まずは「パイプなし」で「ps aux」とコマンドを入力します。(※psコマンドは起動中のプロセスを確認するコマンドです。)

表示されている一番左の項目の「USER」ですが、下にスクロールすると「root」以外にも「rocky001」や「cockpit+」などが表示されています。

今度は「パイプ」を利用してコマンドの結果を別のコマンドへ渡して利用してみたいと思います。次のコマンドを入力します。「ps aux | grep rocky001」(※grepはファイル内の文字列検索コマンドです。)

結果として「rocky001」が存在する部分が抽出されています。

このコマンドでは全てのプロセスをpsコマンドで抽出した結果をパイプを利用してgrepコマンドに渡しています。これによって、「抽出結果」から「rocky001に該当するものをピックアップ」して表示をすることができています。

パイプのイメージ

「リダイレクト」の概要と利用方法

「リダイレクト」とは

出力先や入力先を変更することをリダイレクト(もしくはリダイレクション)といいます。

通常入力先には「キーボード入力」、出力先には「画面出力」を利用しますが、リダイレクトを利用すると、これらを「ファイルからの入力」や「ファイルへの出力」と変更することができます

「リダイレクト」の利用方法

出力リダイレクション

出力先を変更するリダイレクトを「出力リダイレクション」といい記号の「>」を利用して「コマンド > ファイル名」のように実行します。

[rocky001@rockylinux001 ~]$ ls(出力先は画面になります。)
dir1 dir2 dir3 linux3.txt rocky1.txt rocky2.txt rocky3.txt rocky4.txt rocky5.txt
[rocky001@rockylinux001 ~]$ ls > rocky3.txt(出力先をrocky3.txtとします。)
[rocky001@rockylinux001 ~]$ cat rocky3.txt(rocky3.txtの中身を確認。)
dir1
dir2
dir3
linux3.txt
rocky1.txt
rocky2.txt
rocky3.txt
rocky4.txt
rocky5.txt

catコマンドでリダイレクトを行うとファイルへの入力が可能になります。書き込みを抜ける場合は「Ctrl + d」を押下します。

[rocky001@rockylinux001 ~]$ cat > rocky3.txt(リダイレクトで文字入力)
abcdefghijklmn(文字を入力します。)
Ctrl + dを入力して抜けます。(文字を入力します。)
[rocky001@rockylinux001 ~]$ cat rocky3.txt(ファイル内容の確認。)
abcdefghijklmn
Ctrl + dを入力して抜けます。
[rocky001@rockylinux001 ~]$

rocky3.txtの中身が上書きされています。リダイレクトは「>」で行うたびにファイルの中身が上書きされていきます。

リダイレクトでファイルへの追記を行う場合は「>>」を利用します。

「ls -l >> rocky3.txt」とコマンドを入力してcatコマンドで中身を確認してみます。先に入力した2行に追記されて「ls -l」コマンドの結果が入力されいます。

[rocky001@rockylinux001 ~]$ ls -l >> rocky3.txt(追記のリダイレクト)
[rocky001@rockylinux001 ~]$ cat rocky3.txt
abcdefghijklmn
Ctrl + dを入力して抜けます。
total 12
drwxrwxr-x. 2 rocky001 rocky001 6 Apr 24 14:31 dir1
drwxrwxr-x. 2 rocky001 rocky001 6 Apr 24 14:31 dir2
drwxrwxr-x. 2 rocky001 rocky001 6 Apr 24 14:31 dir3
-rw-rw-r–. 1 rocky001 rocky001 0 Apr 24 14:30 linux3.txt
-rw-rw-r–. 1 rocky001 rocky001 226 Apr 25 16:24 rocky1.txt
-rw-rw-r–. 1 rocky001 rocky001 227 Apr 25 16:34 rocky2.txt
-rw-rw-r–. 1 rocky001 rocky001 54 Apr 26 14:19 rocky3.txt
-rw-rw-r–. 1 rocky001 rocky001 0 Apr 24 15:20 rocky4.txt
-rw-rw-r–. 1 rocky001 rocky001 0 Apr 24 15:20 rocky5.txt

入力リダイレクション

入力先を変更するには記号の「<」を利用します。

入力リダイレクションの操作は割愛します。

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

標準エラー出力のリダイレクトには記号「2>」追記の場合は「2>>」を利用します。

この「2」はファイルディスクリプタの番号を意味します。

ここでは、エラー出力に対して標準出力のリダイレクトを試してみます。結果としてエラーはリダイレクトされません。

[rocky001@rockylinux001 ~]$ cat rocky8.txt > rocky4.txt
cat: rocky8.txt: No such file or directory
[rocky001@rockylinux001 ~]$ cat rocky4.txt(中身の確認)
[rocky001@rockylinux001 ~]$(中身がないので何も表示されません。)

次は「2>」を利用して確認してみます。

[rocky001@rockylinux001 ~]$ cat rocky8.txt 2> rocky4.txt
[rocky001@rockylinux001 ~]$ cat rocky4.txt(中身の確認)
cat: rocky8.txt: No such file or directory(中身が確認できました。)
[rocky001@rockylinux001 ~]$

今回は以上になります。

「Linux」おすすめ書籍6選【初心者・脱初心者用】| 現役エンジニア&プログラミングスクール講師「Linux」初心者の方がLinuxの操作や仕組みを理解するためのお勧めの書籍について取り上げています。また中級者として更に進んだ学習ができる書籍についても1冊取り上げています。ページの下部には「おすすめのITスクール情報」「おすすめ求人サイト」について情報を掲載中。...

ブックマークのすすめ

「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。

「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】「お気に入り」の登録・削除方法【Google Chrome / Microsoft Edge】について解説している記事です。削除方法も掲載しています。...
【パソコン選び】失敗しないための重要ポイント | 現役エンジニア&プログラミングスクール講師【パソコン選び】失敗しないための重要ポイントについての記事です。パソコンのタイプと購入時に検討すべき点・家電量販店で見かけるCPUの見方・購入者が必要とするメモリ容量・HDDとSSDについて・ディスプレイの種類・バッテリーの持ち時間や保証・Officeソフト・ウィルス対策ソフトについて書いています。...