プログラミング学習をしていると「標準入力から入力される整数データNをほにゃららして標準出力せよ。」みたいな問題をよく見かけます。
なんとなく用語としては知っていたのですが意味としては読み飛ばしがちでしたので、これらについて学んでいきます。
前回のあらすじ
前回はリダイレクトについて学びました。
この中で標準入出力の話があったので今回学んでいきます。
標準入力・出力・標準エラーというのは
てっきりコンソールに入力、あるいは出力するデータのことかと思ってましたがなんか微妙に理解が違ったようです。
プログラムの入出力が、特に指定されていない場合利用する「入出力元あるいは先」とのこと。
標準入力
stdin
プログラムに入力されるデータや、「入力元」のことを言います。後者は一般的にはキーボードが指定されています。
入力元がファイルということもあります。
標準出力
stdout
プログラム実行結果の「出力先」、一般的にはディスプレイが指定されてます。
出力先がファイルということもあります。
標準エラー出力
stderr
プログラム実行した結果のエラーの「出力先」、一般的にはやはりディスプレイということになります。
そして同じく出力先がファイルということもあります。
これらの識別方法
ファイルディスクリプタ(File Descriptor)、ファイル識別子とも呼ばれる番号で識別されます。
in/out | File Descriptor |
---|---|
stdin | 0 |
stdout | 1 |
stderr | 2 |
リダイレクトして出力先を変える
ここで前回学んだリダイレクトの意味がようやく理解できます。
基礎がなってない人間というのはこういう回り道した理解をしてしまいがちですw
echo "hello world" > file.txt
これは標準出力先をディスプレイ(コンソール上)ではなく指定したファイルと変更したということになります。
dev/nullとかいうブラックホール
簡単に言うと/dev/null
はゴミ箱で、こちらに出力結果をリダイレクトするなどして捨てると、出力結果は消えます。
全て破棄されるため復元できません。まさにブラックホールです。
仮想環境として試行錯誤に便利なEnvaderで実行してみます。
$ cat file.txt > /dev/null
何も出力されません。
標準出力のみ表示し標準エラー出力を捨てるには
$ cat file.txt 2> /dev/null
# 逆に標準エラー出力のみ表示し標準出力を捨てるには
$ cat file.txt 1> /dev/null
/dev/null
をつかってファイルの中身を殻にすることもできます。
$ cat /dev/null > file.txt
空を上書きしたためfile.txtの中身は空になりました。
コード参照:https://envader.plus/course/1/scenario/1007
学んだこと
- 標準入出力というのは入力元、出力先であるということを理解しました。
- リダイレクト等で標準入出力対象は変えることができる。
/dev/null
とかいうブラックホールへのデータの捨て方。開発時に余計な出力しなくていいなと。
コメント