標準入出力
- 標準入力(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 | エラー出力をファイルへ追記 |