知っておくとちょっと便利!標準入力・標準出力・標準エラー出力について

今号では、Linux における標準入力標準出力標準エラー出力について解説します!

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

標準入力とは、プログラムが使うデータを受け取るための読み込み元を意味します。
主な標準入力として、キーボードなどがあります。
標準出力とは、プログラムが使うデータの出力先を示します。
それに対して標準エラー出力とは、プログラムが使うデータのうち、エラーの出力先を意味します。
主な標準出力・標準エラー出力として、コンソール、ディスプレイなどがあります。

また、コマンド操作における標準入力・標準出力・標準エラー出力では、パイプライン
リダイレクトという仕組みを使用することができます。

パイプライン

パイプラインとは、コマンドの出力を別のコマンドの入力として扱う仕組みです。
“|” で表現します。
例えば、text.txt というファイルの内容から grep コマンドで特定の文字列を抽出する場合、下記の様なコマンドを実行します。

# cat text.txt | grep aaa
aaa

前提として、text.txt の内容は下記の通りです。

# cat text.txt
aaa
bbb
ccc
ddd
eee

この時、cat text.txt にて出力された内容が “|” (パイプライン) を通じて grep コマンドに渡され、grep コマンドはその標準入力からデータを受け取っています

リダイレクト

リダイレクトとは、コマンドの出力先を別の出力先 (ファイルなど) に変更することができる仕組みです。
“>”“<" で表現します。

  • 標準出力のリダイレクト
    例えば、ls コマンドでカレントディレクトリのファイル一覧を表示させた場合、結果をコンソールではなくファイルに出力する場合、下記の様なコマンドを実行します。

    # ls > /tmp/file.txt
    #
    

    file.txt の内容は下記の通りとなります。

    # cat /tmp/file.txt
    file1
    file2
    file3
    
  • 標準エラー出力のリダイレクト
    上記で解説した標準出力 “>” の場合、エラーとなる実行結果、つまり標準エラー出力はリダイレクトしません。
    例えば、先ほどと同様に ls コマンドの実行結果を標準エラー出力のリダイレクト “2>” を使用してファイルに出力してみますが、出力先ファイルには何も記録されません。
    代わりに、デフォルトの標準出力であるコンソールに実行結果が表示されています。

    # ls 2> /tmp/file.txt
    file1  file2  file3
    # cat /tmp/file.txt
    #
    

    では、ls コマンドで存在しないファイルを指定して実行した場合はどうでしょうか。
    この場合、コンソールには何も表示されず実行結果が file2.txt にリダイレクトされたことが分かります。

    # ls file4 2> /tmp/file2.txt
    # cat /tmp/file2.txt
    ls: file4 にアクセスできません: そのようなファイルやディレクトリはありません
    
  • 標準出力、標準エラー出力両方のリダイレクト
    上記で解説した標準出力、標準エラー出力を両方同時にリダイレクトさせることもできます。
    先ほどの 2通りの ls コマンドを下記の様にそれぞれ実行すると、いずれの場合も実行結果が各ファイルへ書き込まれた事が分かります。

    # ls > /tmp/file.txt 2>&1
    # ls file4 > /tmp/file2.txt 2>&1
    # cat /tmp/file.txt
    file1
    file2
    file3
    # cat /tmp/file2.txt
    ls: file4 にアクセスできません: そのようなファイルやディレクトリはありません
    
  • 標準入力のリダイレクト
    パイプラインの章で解説した grep コマンドの実行例ですが、標準入力のリダイレクトを使用しても同じことができます。

    # grep aaa < text.txt
    aaa
    
ご覧いただきありがとうございます! この投稿はお役に立ちましたか?

役に立った 役に立たなかった

0人がこの投稿は役に立ったと言っています。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です