目標
標準入力・標準出力・標準エラー出力について概要を理解する。
「パイプ」と「リダイレクト」について概要と利用方法を理解する。
標準入出力とファイルディスクリプタの概要
標準入力・標準出力・標準エラー出力の概要
標準入力・標準出力・標準エラー出力とは
Linuxのコマンドは「外部からのカーネルへの問い合わせ(キーボードからの入力)→カーネルはシェルに読み取りの要求(解析)→シェルからカーネルへ実行を要求→カーネルによる実行」の流れで処理が行われます。
コマンドの実行後は結果を「カーネル→外部(モニターやファイル)の順番」で出力されます。※エラーの場合は標準エラー出力「カーネル→外部(モニターやファイル)の順番」で出力されます。
コマンドは、この受け渡しに対して常に「ひとつの入力口」と「ふたつの出力口」を用いて実行されます。これらをそれぞれ「標準入力」「標準出力「標準エラー出力」といいます。
- 標準入力…コマンドが入力を受け取るためのインターフェースでキーボードが繋がれています。
- 標準出力…コマンドの実行結果を受け渡すインターフェースでモニターが繋がれています。
- 標準エラー出力…コマンドの実行結果としてエラーメッセージを受け渡すインターフェースでこちらもモニターが繋がれています。
ファイルディスクリプタの概要
ファイルディスクリプタとは
ファイルディスクリプタはファイルを識別するための番号(目印)のことを言います。この番号のうち、特別なファイルを示すものがあり、「0」「1」「2」があります。これらの番号は「0:標準入力」「1:標準出力」「2:標準エラー出力」と決まっています。
「パイプ」と「リダイレクト」
「パイプ」の概要と利用方法
「パイプ」とは
コマンドの処理結果を別のコマンド処理へ渡して利用することができます。このコマンド処理を渡す機能を「パイプ」といい「Shift + \」で入力できます。(実際の記号「|」)
「パイプ」の利用方法
実際の「パイプの利用」を行ってみます。まずは「パイプなし」で「ps aux」とコマンドを入力します。(※psコマンドは起動中のプロセスを確認するコマンドです。)
表示されている一番左の項目の「USER」ですが、下にスクロールすると「root」以外にも「rocky001」や「cockpit+」などが表示されています。
今度は「パイプ」を利用してコマンドの結果を別のコマンドへ渡して利用してみたいと思います。次のコマンドを入力します。「ps aux | grep rocky001」(※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 ~]$
リダイレクトでファイルへの追記を行う場合は「>>」を利用します。
「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 ~]$
今回は以上になります。
ブックマークのすすめ
「ほわほわぶろぐ」を常に検索するのが面倒だという方はブックマークをお勧めします。ブックマークの設定は別記事にて掲載しています。
なぜ、出力には「標準出力」と「標準エラー出力」があるのか。
コマンド処理には「処理が完全に行われる」パターンと「処理が途中で止まってしまう」パターンの2つがあります。2つのパターンがあるということはプログラム的にも処理を別々に行わせる必要があることになります。
お使いで例えると、子供に「牛乳と卵を買ってきて」と頼んだとします。
この処理は、
1.買い物袋とお金を持ってスーパーに行く。
2.牛乳と卵を買う。
3.家に帰って牛乳と卵を冷蔵庫に入れる。
4.お使いが終わったことを連絡する
とします。
この時「牛乳と卵を買えた場合は」は冷蔵庫には牛乳と卵が入っていることになります。(標準出力)
ですが、もし卵がスーパーになかった場合は、いくつかの結果が考えられます。例えば、「子供がスーパーから帰ってこない。」「子供は帰ってきたが冷蔵庫には卵がない」「まだ連絡がない」など。このような時に、エラー専用の処理とその結果を出力させてあげる準備をしていれば「なぜ?」ということにはならないことになります。このエラー結果を出力させるのが「標準エラー出力」となります。