1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

標準入出力についてまとめてみた

Last updated at Posted at 2022-02-26

標準入出力

標準入力(stdin)
プログラムの標準的な入力。通常はキーボードが使用される。
標準出力(stdout)
プログラムの標準的な出力。通常は端末ディスプレイが使用される。
標準エラー出力(stderr)
プログラムのエラーメッセージを出力するための標準的な出力。
標準出力と同じく端末ディスプレイが使用される。

難しく聞こえるがキーボードでコマンドを入力することや、
入力結果が出力されることを言っている。

少しイメージをしやすいように例えるなら

  • Googleの検索フォームにキーワードを入力(標準入力)する
  • 検索結果がブラウザに表示(標準出力)される
  • 検索結果の1番上のURLをクリック(標準入力)する
  • 404エラーページが返ってくる(標準エラー出力)

404エラーページが返ってくる(標準エラー出力)

ここ自信ないので間違ってたらご指摘いただけると嬉しいです😅

この3つを合わせて標準入出力と呼ぶ。

それぞれの入出力先はこちらが何も指定しないと、

通常はキーボードが使用される。
通常は端末ディスプレイが使用される。

.. となるが、柔軟に変更することが可能。
そして入出力先を変更することをリダイレクトと呼ぶ。

リダイレクト

標準入出力先を変更する機能のこと。

リダイレクトがあると嬉しいこと

  • コマンドの出力結果(標準出力)をコマンドの入力(標準入力)に繋げることで複雑な処理を実現できる
  • 出力結果をファイルに書き込むことができる

そしてLinuxの各コマンドは実行結果が必ず標準入出力になるように設計されており、各標準入出力は数値として管理されている。

入出力 数値
標準入力 0
標準出力 1
標準エラー出力 2

こちらは今回あまり詳しく記載しませんが後ほど少々使用するためご紹介。

実際にやってみる

標準出力のリダイレクト

リダイレクトなし(出力先 -> ディスプレイ端末)

% echo HelloWorld
HelloWorld

リダイレクトあり(出力先 -> テキストファイル)

% echo HelloWorld > helloworld.txt
% cat helloworld.txt
HelloWorld

入力したHelloWorldがファイルに書き込まれています。
出力先を存在するファイルにする場合、上記では上書きされてしまいます。
内容の追記を行いたい場合は>>を使用してリダイレクトします。

% echo HelloWorld2 >> helloworld.txt
% cat helloworld.txt
HelloWorld
HelloWorld2

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

試しに存在しないファイルをcatの引数に与えてみる。

$ cat helloworld2.txt
cat: helloworld2.txt: そのようなファイルやディレクトリはありません

期待通りの結果ですね。
上記を標準出力のリダイレクトと同じ方法でファイルに書き込んでみる。

% cat helloworld2.txt > error.txt
% cat: helloworld2.txt: そのようなファイルやディレクトリはありません

% cat error.txt
%

おや...期待する挙動ではないですね。そもそも...

上記を標準出力のリダイレクトと同じ方法でファイルに書き込んでみる

を行った際に通常の出力先(端末ディスプレイ)に結果が返ってきてました。

$ cat helloworld2.txt
cat: helloworld2.txt: そのようなファイルやディレクトリはありません

なぜか?
標準出力エラーの場合は数値の2として管理されていて、
標準出力と同じ方法ではリダイレクトが行えません。

でもエラーメッセージをファイルに書き込みたい...そんな時はこうします。

% cat helloworld2.txt 2> error.txt
% cat error.txt
cat: helloworld2.txt: そのようなファイルやディレクトリはありません

うまくいきました。
2>は標準エラー出力をファイルにリダイレクトしてねということになります。

標準入力のリダイレクト

引数にキーボードでの入力ではなくファイルを渡してみます。

% cat < helloworld.txt
HelloWorld
HelloWorld2

期待通りに動いています。
ちなみに<がなくても同じ結果が得られます。

% cat helloworld.txt
HelloWorld
HelloWorld2

一見全く同じように見えますが、前述の標準入出力の数値が変わります。
この違いはいつかご紹介する|(パイプ)を使用する際に重要になってきます。

最後に

今回紹介したリダイレクトの種類をまとめておきます。
他にもあるので気になる方は調べてみてください。

コマンド 実行結果
command > file コマンドの出力結果をファイルへ書き込み
command < file ファイルの中身をコマンドの標準入力へ切り替え
command >> file コマンドの出力結果をファイルへ追記
command 2> file エラー出力をファイルへ書き込み
command 2>> file エラー出力をファイルへ追記
1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?