Linuxの標準入力・標準出力・標準エラー出力ってなんぞ?

プログラミング学習をしていると「標準入力から入力される整数データNをほにゃららして標準出力せよ。」みたいな問題をよく見かけます。

なんとなく用語としては知っていたのですが意味としては読み飛ばしがちでしたので、これらについて学んでいきます。

前回のあらすじ

前回はリダイレクトについて学びました。
この中で標準入出力の話があったので今回学んでいきます。

Linuxのリダイレクトechoコマンドや|(パイプ)をお勉強
インフラエンジニアというわけではないのですがAWS好きなのでLinuxを基礎から学びなおしている猫だくさんです。甥にプログラムはいいぞといい続けてついにパソコン買わせることに成功しました。(いくらかお金は出しました)これでネトゲ廃人にな...

標準入力・出力・標準エラーというのは

てっきりコンソールに入力、あるいは出力するデータのことかと思ってましたがなんか微妙に理解が違ったようです。

プログラムの入出力が、特に指定されていない場合利用する「入出力元あるいは先」とのこと。

標準入力

stdin
プログラムに入力されるデータや、「入力元」のことを言います。後者は一般的にはキーボードが指定されています。
入力元がファイルということもあります。

標準出力

stdout
プログラム実行結果の「出力先」、一般的にはディスプレイが指定されてます。
出力先がファイルということもあります。

標準エラー出力

stderr
プログラム実行した結果のエラーの「出力先」、一般的にはやはりディスプレイということになります。
そして同じく出力先がファイルということもあります。

これらの識別方法

ファイルディスクリプタ(File Descriptor)、ファイル識別子とも呼ばれる番号で識別されます。

in/outFile Descriptor
stdin0
stdout1
stderr2

リダイレクトして出力先を変える

ここで前回学んだリダイレクトの意味がようやく理解できます。
基礎がなってない人間というのはこういう回り道した理解をしてしまいがちです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とかいうブラックホールへのデータの捨て方。開発時に余計な出力しなくていいなと。

参考資料

標準入力・標準出力ってなに? - Qiita
はじめに動機かなり初心者AdventCalendarにかこつけてみました。Linuxのシステムを運用する人であれ、プログラム開発をする人であれ、標準入力・標準出力という言葉には日常的に触れること…
標準入出力とは?プログラミングテストの過去問で解説
標準入出力とは何かをググってみると、多くのサイトでは「標準入力=キーボード入力、標準出力=画面出力」と説明しています。この説明自体は問題ありませんが、もう少し深掘りしませんか? 本記事では、標準入出力とは何かについて説明するとともに、プログラミングテストの問題を例にあげて標準入出力について解説します。
コース一覧 | エンベーダー
コース一覧に関するページです。Linuxを学べるLinux基礎・応用コースを始めとして、エンジニア必須の知識であるデータベースやセキュリティのコースもあります。

コメント