• ベストアンサー

標準出力の意味

Linuxの初学者です。宜しくお願いします。 リダイレクトなどの説明で「標準出力」とあるのですが、 これはどういった意味なのでしょうか?。 ・コンソールに出力 ・/var/messagesファイルに出力 など出力先を選択することなのでしょうか。 「標準エラー出力」もあり、うまく理解ができず。。 アドバイスを頂ければ幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.3

"出力" ”先” つまり、データーの表示先を切り替える事ができる、または選ぶ事ができるシステムでは、そのような言い方をする。 これと同じで、”入力先”も選べますね。マウスやキーボード、今では、タッチパネルなど。 将来は、出力先 => テレビ、腕時計、ヘッドセット、電子レンジ、エアコン、冷蔵庫、自動車 等、家電などの融合マシンになるでしょう。 へたすると、人間の脳なんてことになるかもしれません。実際、出力先を、人間の脳にして、腕、手を動かす義肢が実用化されています。 入力は、人間の脳が発する微弱な電流です。それを、義手の手のモーターの動作に替えています。テレビで実験で5本の指で物を掴む、握る、なんて動作をしていました。まるで映画の世界でしたよ。 実際にひじからしたが無い障害者に手伝ってもらって、実験していました。 で、”標準”とはですが、普通想定される、デバイスが”モニター” ですので、”標準” とは、”コンソール” つまり、シェルのメイン(アクティブ)に出力されます。 出力先を想定するということは、出力するデーターを規定のデータにそろえて、そこに合うように変換して、そのデバイスの規定通りにインターフェースに渡す事を言います。 つまり、入力側にも例えば、テレビの音、映像入力端子があるように、違うようになっていれば、別データーとして扱えるので、 エラー出力先も別ソケットに渡せば、想定されたデバイスに渡してくれるだけです。 ただ、コンピューターの世界ですので、たいてい論理デバイスである場合が多いです。 そういった意味で ”リダイレクト” とは論理デバイスに渡すソケットを、別ソケットにつけ変える事をいいます。 冷蔵庫とか、電子レンジのコンセントを壁にある、コンセントから、たこ足配線可能なタップに変えることと同じ事です。

semaster
質問者

お礼

有難うございます。 「標準」とはデバイスだと「モニター」なのですのね・・。 ちなみに「シェルのメイン(アクティブ)に出力」とは、 具体的にはどういったイメージなのでしょうか。

その他の回答 (5)

noname#208507
noname#208507
回答No.6

Linuxではファイルやコンソールなど入出力の対象を、ファイルディスクリプタという番号で表します。標準とは、入力に0番、出力に1番のファイルディスクリプタを使う約束という意味です。 ファイルを開いたときディスクリプタが何番になるか、通常は前もって分かりません。ただしディスクリプタは複製でき、複製するとその時点で使っていない一番小さい番号が新たに割り当てられます(そういう機能をOSが提供しています)。 出力をファイルにリダイレクトするプログラムは ・まずファイルを開く。何番かのディスクリプタが割り当てられる。 ・1番(標準出力:デフォルトはコンソール)を閉じる。  この時点で最小の未使用番号は1番となる。 ・開いたファイルのディスクリプタを複製すると1番が割り当てられる。 ・1番に出力するとリダイレクト先のファイルに書き込まれる。 パイプによるリダイレクトも同じ要領です。パイプという特殊なファイルを作り、0番(標準入力)と1番(標準出力)を閉じて、それぞれパイプを複製すると0番と1番が接続されます。あとは出力側のプログラムが1番に書き出し、入力側のプログラムが0番から読み込めば通信できます。 つまり0番を入力・1番を出力と約束しておけば、わざわざ通信相手のプログラムにディスクリプタの番号を伝える必要がなくなり、プログラムが簡単になります。

semaster
質問者

お礼

有難うございます、内部ではそういった操作を しているのですね。勉強になりました。

  • yakan9
  • ベストアンサー率54% (2200/4047)
回答No.5

コンピュータの歴史を学ばないとピンとこないと思います。 パソコンの歴史はここ20年くらいです。 その前は大型コンピュータのタイムシェアリングサービスと言われるもので、個人の端末機器で大型コンピュータと接続して、そのリソース、すなわち、大型コンピュータセンタの機器を使って、コンパイル、リンケージ、実行といった課程でコンピュータを利用していました。 この時、表示の指示で、どこに表示するかの指示を出す際、画面に出すことでスピードが早い利点を基本としていました。 このときの既定値として、画面出力設定にしていたということです。 今でも、大学関係や、スーパーコンピュータを利用する場合は、端末機器で、大型コンピュータの並行処理を利用する場合は、タイムシェアリングを利用しています。

semaster
質問者

お礼

有難うございました。

  • vaidurya
  • ベストアンサー率45% (2714/5983)
回答No.4

MS-DOS全盛期だと、逆に標準出力は理解しやすかった気もしますね。 最小構成で、ちょっとしたテキストファイルを作る場合に COPY CON TEST.TXTとかやっていましたし COPY TEST.TXT PRNでプリントアウトする場合もありました。 ソフトウェアは、対話的に操作するものと、自動処理し自動終了するものに大別できます。 前者はアプリケーションソフトウェアやユーティリティーソフトウェアなどいくつかがあり… 後者は、コマンドと総称されます。 コマンドには、シェルの標準コマンドと外部コマンドがあるのは、MS-DOS系でもUNIX系でも同様です。 アプリケーションソフトなら、ファイルメニューから保存を選んだりするわけですが… コマンドは、処理するからには、その結果をどこかに出力する必要があります。 ですから、その結果をコンソールに表示するのが、その自然なカタチです。 MS-DOSでもDIRコマンドやCOPYコマンドなどの結果が画面に出力されます。 そして、標準出力は、なんらかのデバイスやファイルなどに変更できます。 また、標準入力としてのキーボードは、他のコマンドやなんらかのデバイスに変更できます。 (正確には他のコマンドとの受け渡しは、標準出力と標準入力が繋がるカタチで実現されます) MS-DOSでは、予約ファイル名というカタチで扱えるデバイスがいくつかあり… UNIX系OSでは、デバイスファイルとして扱うのが、ほとんどのデバイスの基本的操作手段です。 たとえば、関連する設定が整っていれば、cat /dev/video0 test.mpgでTV録画ができる場合もあります。 MS-DOSには、全盛期に録画システムなどなかったためもあり、こういう手段での録画はできません。 (Windowsでは録画専用コマンドを使うか、録画システムやアプリケーションソフトを必要とします) 指定しなければ、画面に表示するよってのが標準出力ですから バッチファイルやシェルスクリプトで何も表示しなくて良いよってときは MS-DOSでは出力先をNULに指定し、UNIX系OSでは/dev/nullに指定します。 表示しなくてもいいけど、記録はとっておきたいという時はリダイレクトでファイルに保存したりします。 記録管理を重視するなら、記録を日時を含むユニークなファイル名で蓄積しますが… 単純に、>>による追記リダイレクトで、一応保存しておくという使い方もあります。 UNIX系OSでは、歩きながら鼻歌を歌うくらいに、ごく当たり前に 自動処理/終了するコマンドを使い、また複数組み合わせて多様な処理ができます。 それは、それを前提にしたソフトが充実することによって成立しています。 たとえば、キーワード指定で自動録画された、たくさんのファイルの中から ls -lh *.ts|grep "ワンピース"|wc -l といった一行の処理で、指定したキーワードをファイル名に含むファイルの数を確認できます。 MS-DOS,Windowsで真似しようとすると、wcコマンドに相当するものが標準装備されていません。 まぁ、ほとんどにオープンソース実装があるから、MS-DOSへ移植されているものも多いんですけどね。

semaster
質問者

お礼

有難うございます、勉強になりました。

  • vbvdv
  • ベストアンサー率0% (0/1)
回答No.2

私も初心者ですが、テキスト処理系のコマンドをパイプでつないでみる(あるコマンドの標準出力を次のコマンドの標準入力につなぐ)ことでイメージがつかめました。

semaster
質問者

お礼

有難うございました。

  • picknic
  • ベストアンサー率25% (33/132)
回答No.1

標準出力はディスプレイ(コンソール) 標準エラー出力もディスプレイ(コンソール) がデフォルトで指定されています。 普通のメッセージはコンソール エラーメッセージはファイルに書き出したい というときは、 標準出力はそのままにして、 標準エラー出力をファイルにリダイレクトしたりして使います。 最初はこんな感じでいいと思います。

semaster
質問者

お礼

有難うございました。 出力先が「コンソール」の場合ですが これは具体的にあげるとすると、Teratermの画面とか、 そういったイメージでしょうか・・。

関連するQ&A

  • コンソール出力をテキストに出力する方法(コンソール出力は残しつつ)

    【質問】  Perl内部で実行される実行ファイル(.exe)のコンソール出力(STDOUT,STDERR)をテキストファイルに出力したい。(Perlのコンソール出力も含む。) ※コンソール出力は残しつつ。 (コマンドプロンプトの)パイプとリダイレクトを使用して上手くいくかと思ったのですが、標準出力と標準エラーとでは標準エラーが先に出力されてしまい、本来出力される順番で出力されない。(標準出力はバッファにたまるため??) 何かいい方法はありませんでしょうか? 【環境】  Windows2000  Active Perl 5.8.8

    • ベストアンサー
    • Perl
  • 標準出力、標準エラー出力 以外の出力??

    Linux上のCADツールが端末に出力してくる文字列をファイルに落とすことができないで困っています。 どのようなことが起きているのでしょうか? また、このような場合、どのようにしたら端末上に流れる文字をすべてファイルとして保存できるのでしょうか。 %> CAD_TOOL.exe |& tee log として標準出力、標準エラー出力の両方をlogというファイルにおとしたつもりなのですが、画面に流れたすべての文字列が保存されている訳ではないのです。 Linuxの出力には標準出力と標準エラー出力の2つ(だけ)がある[*]、と思っていましたが他の出力方法があったりするのでしょうか。。。 [*]http://x68000.q-e-d.net/~68user/unix/pickup?%A5%EA%A5%C0%A5%A4%A5%EC%A5%AF%A5%C8 宜しくお願いします。

  • solarisの/var/adm/messagesの出力内容について

    solarisでは/var/adm/messagesにカーネルからのメッセージが出力されるとのことですが、出力内容はそれぞれ何を意味しているのでしょう? /etc/syslog.confでエラーメッセージの設定をすると、設定に応じたエラーが出力される・・といった漠然とした理解しかできておらず、いまいち/var/adm/messagesの読み方が分かりません。 インターネットで調べてみるも、出力内容の読み方が書いてあるサイトは見つからず・・ 出力内容の読み方や、それについて詳細に書いてあるサイトなどありましたら教えてください、よろしくお願いします。

  • /var/log/messagesエラー出力

    Linux初心者です。 初Linuxサーバを構築して、色々とパッケージをインストールしています。 サーバ再起動後に、/var/log/messagesを確認していますが、 [Warning]のエラーの確認は出来たのですが、他にどのような出力があるのかが分からない状況です。 Warning=警告だとすれば、Windowsのように、 ・Info=情報 ・Error=エラー とか、出力されるのでしょか? /var/log/messagesで注意した方がいい文字を教えて頂けないでしょか?

  • 標準出力/標準エラー出力を時系列にファイルへ

    画面への文字出力が、標準出力(stdout)と標準エラー出力(stderr)の 両方もつような、コンソールアプリ(exe形式)のツールを動作させたときに、 画面上には、 stdout1 STDERR1 stdout2 STDERR2 stdout3 STDERR3 のような順番で処理順にメッセージが出るのですが、 これをファイルに落とそうとして、  C:\>hoge.exe 1> log.txt 2>1& とすると、log.txtの中身が、 C:\>type log.txt STDERR1 STDERR2 STDERR3 stdout1 stdout2 stdout3 のような標準エラー出力が先に吐き出される順番になってしまっています。 これを、exe実行前に、MS-DOSとして何らかの設定を行うことで、 ファイルに落とした時も、出力された文字が時系列に保存されるように する方法はあるでしょうか? よろしくお願いします。

  • 標準出力とリダイレクトを同時に実行

    標準出力の結果をファイルに保存するにはリダイレクトを使うと思いますが、同時に標準出力にも表示したいです。 同時に、リダイレクトの「>>」のように、追記していくようにしたいです。 そのような場合、 http://blog.goo.ne.jp/minimal_room/e/26b4d965cd67ac5abfc4ca024e69501f によれば、teeコマンドを使うと良いそうなのですが、 ./a.out | tee log.txt のようにすると、標準出力されず、上手くいきませんでした。 どのようなコマンドを打ったら良いか教えて下さい。

  • 処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方

    処理結果(標準出力と標準エラー出力)をファイルと画面の両方に出力する方法はありますか? 当方 処理結果(標準出力と標準エラー出力)をファイルに出力する際に iroirona_command > log.log 1>&2 ・・・ファイルに出力されるが画面には表示されない。 iroirona_command ・・・画面には表示されるがファイルには出力されない。 と書いて標準出力と標準エラー出力を出力させているのですが、 ファイルと画面の2つの出力先に出力したいと考えています。 可能なのでしょうか? 環境 Windows XP SP3

  • syslogの出力先追加

    syslogの出力先を追加する方法について教えていただきたいです。 使用環境は、Red Hat系のLinuxです。 現状、syslog.confの設定が下記のようになっているため、messagesファイルに syslogが大量に出力され、必要なログを探すのが大変な状態です。 syslog.confの中身 *.info;mail.none;authpriv.none;cron.none /var/log/messages authpriv.* /var/log/secure mail.* /var/log/maillog cron.* /var/log/cron *.emerg * uucp,news.crit /var/log/spooler local7.* /var/log/boot.log そこでfacilityのlocal0-7を使用し、syslogに出力するファイルを分散 させようと考えています。 例えば、local0の出力先を追加するのは、syslog.confを下記のように 修正すればよいでしょうか。 (実際に試せばよいのでしょうが、多くの人達が使用している環境のため、  syslogd再起動が出来ない状態です。) messagesの設定 修正前:*.info;mail.none;authpriv.none;cron.none /var/log/messages 修正後:*.info;mail.none;authpriv.none;cron.none;local0.none /var/log/messages local0の設定 追加:local0.* /var/log/ファイル名 ご回答の方、よろしくお願いします。

  • teeコマンドを使わずにUNIXで標準出力とエラー出力を、ファイルと標準出力の両方に出すには?

    UNIX系のBシェルで、 コマンドを実行して、 その標準出力とエラー出力をログファイルに出力し、 かつ、同じものを標準出力にも出力したいのです。 また、その後でコマンドの戻り値$?をエラーチェックしたいです。 このため、パイプでteeコマンドを使用すると戻り値が上書きされてしまいます。 いったん一時ファイルに出力するしかないのでしょうか?

  • shell の time コマンドの結果をファイルに出力する方法(AIX)

    AIX4.3 の環境でプログラムのパフォーマンスを確認しようと思っています。「time XXXXX 2> perform.log」で標準エラー出力をファイルに書き出そうとしているのですがうまくいきません。time コマンドのパフォーマンス結果は標準エラー出力に書き出されると思うのですが、リダイレクトしたファイルは何も書かれていません。画面にtime コマンドの結果が表示されるだけです。time コマンドではなく通常のエラーは標準エラー出力からファイルに書き出すことはできます。原因がわからずこまっています。よろしくお願いします。