標準入力の利用価値とは?

このQ&Aのポイント
  • 標準入力や標準出力に対応していないプログラムでも、/dev/stdinを利用すると標準入力に対応できる
  • /dev/stdinを利用することで、パイプやヒアドキュメントを使用して標準入力を簡単に扱える
  • /dev/stdinの利用はファイル名を指定する際に便利であり、標準入力の柔軟な扱いが可能
回答を見る
  • ベストアンサー

/dev/stdin

/dev/stdin/ の利用価値を教えてください。 いまいちありがたみがわからないのです。 cat /dev/stdin と入れてみて、「a」と入力すると同じ文字が次の行で表示されました。 #cat /dev/stdin a ←自分で入力 a ←自動で表示された。 ★実行プログラムが標準入力や標準出力に対応していなくでもファイル名を指定するときに これらのファイルを指定することで、標準入出力に対応できます。 パイプやヒアドキュメントをつかって便利に使えるようになりますよ。 というblog記事も見つかったのですが いまいち、ピンと来ないのです。 /dev/stdin を使うとどんなメリットがあるのでしょうか ご教授お願いします。

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

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

Unixの系列のプログラムの場合、パイプを使って小さなプログラムを組み合わせて動かす、という事をよくやります。例えば、「ホームフォルダから辿れる場所にある全てのファイルのうち、文字列"Hello"が最も多く出現するファイルTop 10を表示したい」という場合には、ファイルの一覧を出力するfind、標準入力を引数に変換するxargs、テキストの中から特定の文字を含む行を抽出するgrep、行単位で文字列の編集を行うsed、行単位での重複を削除しつつその出現回数を数えるuniq、並び替えを行うsort、最初の数個だけを表示するheadを用いると $ find ~ | xargs grep 'Hello' | sed 's/:.*$//' | uniq -c | sort -r | head 等と書くことができ、 「一つのことを行い、またそれをうまくやるプログラムを書け。協調して動くプログラムを書け。標準入出力を扱うプログラムを書け。」(quoted from wikipedia)というUnixの哲学に則ったプログラムは組み合わせやすく、再利用しやすいという特性が生きていることが分かります。 ところが、中には標準入出力からの入力に対応していないプログラムもあります。そういったプログラムは通常、実行時引数でファイル名を指定して動くのですが、「指定されたファイルがあたかも存在して、そこから文字列を読み取ると標準入力から文字列を読み取ったことになる」という素敵な作用を持つ(ある意味架空の)ファイルが、その/dev/stdinになります。 e.g.) $ cat /dev/stdin << end. # ここから > hello. > ok. > end. # ここまでヒアドキュメント。catは/dev/stdinを読みに行っている。 hello. # これと次の行は出力された文字列。 ok.

kureakai
質問者

補足

>利用しやすいという特性が生きていることが分かります。 ここまでは理解できました。 >その/dev/stdinになります。 ここまでも理解できました。確かに素敵仕様だと思いますが。 ヒアドキュメント実行したら確かに同じ結果が出ました。 ただ、ヒアドキュメントを上手く理解できず頂いたサンプルでは ありがたみが分かりませんでした。

関連するQ&A

  • /dev/stdinはそれ以降の入力をかき消す???

    意味不明なタイトルですみません。 今回は/dev/stdinについて教えてください。 /dev中のファイルは特殊ファイルなので深追いしない方がいいとは思うのですが詳しい方お願いします。 次のコマンドとその出力を見てください。 $ echo "a > a > a > a > a" | while read LINE > do > grep -l str $LINE > done a a a a a $ これはgrepにファイルaを5回検索させる命令ですが この5行のaの途中に/dev/stdinを挿入すると次のように/dev/stdin以降が出力されなくなってしまうのです!! $ echo "a > /dev/stdin > a > a > a > a" | while read LINE > do > grep -l str $LINE > done a $ この/dev/stdinとはいったい何者なのですか!? このコマンドでは、いったいどのような事態が起こっているのですか!?

  • シェルのリダイレクトとパイプについて

    シェルのリダイレクトとパイプについての質問です. リダイレクトでコマンドの標準出力をファイルに指定した後に, パイプを置いて,もう一つコマンドを並べたとき, 後の方のコマンドの標準入力はどうなるのでしょうか? 例えば, ls >outfile |cat ならば, catの標準入力には,何も入ってこないと思うのですが, これを実行すると,lsの結果がoutfileに書き込まれ, 次のプロンプトが表示されます. 普通,catを引数なしで実行すると, EOFが入力されるまで,入力待ちになると思うのですが, こうならないのは,シェルがcatの標準入力にEOFを入力したからだと 考えていいのでしょうか. よろしくお願いします. (質問の意味が分かりにくければご指摘下さい.)

  • Stdinの使い方

    環境はWindowsXP SP2です。 標準入力から一行の入力を待つプログラムAが有ります。 それをWSHスクリプトBから入力させてやりたいです。 仮に、そのAを <A.vbs> s = WScript.Stdin.Readline WScript.Echo "#" & s とします。問題なく動作します。 そしてはBは <B.js> var WshShell = WScript.CreateObject("WScript.Shell"); var oExec = WshShell.Exec("cscript a.vbs"); oExec.StrIn.Write("abcdef"); としました。しかし Microsoft JScript runtime error: 'oExec.StrIn' is null or not an object なるエラーで失敗します。 どうしてでしょうか。

  • Linuxでキーボードに割り当てられたデバイスファイル(/dev/?)はありますか?

    Linuxで、標準入力をファイルなどキーボードの他に割り当てたときに、別にキーボードから入力を取りたいです。 (エラー処理など) そのために、/dev/?でキーボードに割り当てられたないかと探しているのですが、ないでしょうか? もしあれば教えていただきたいです。 また、なにか他によい方法があれば教えていただきたいです。 よろしくお願いします。

  • VisualC++ でstdinにファイルを指定する方法

    VisualC++のコンソールアプリを作成する機能で、C++の勉強をしています。 ところで、VisualC++で、標準入力にファイルを指定する方法はどうすればいいのでしょうか? Unixでいうところの ./a.out <sample.txt とやりたいのです。 よろしくお願いいたします。

  • MovableTypeのURLについて?

    ムーバブルタイプの各ファイルURLの事で質問します。 ムーバブルタイプで新しいカテゴリを作ると http://******.com/blog/cat1/ のようになり新しい記事を作ると http://*****.com/blog/2006/06/post_1.html のようになると思います。 これを http://******.com/blog/cat1/00001.html のようにしたいのですが、どこをどのようにすればいいか分かりません。 特にカテゴリ名やファイル名にはこだわらないのですが、ムーバブルタイプで日記として使うのではなくサイト風として使いたいと考えています。 よろしくお願いします。

  • 入力を待たずにstdinの監視をしたい(C言語)

    こんにちは.タイトルのままなのですが,c言語でstdinに何かが入力されるまで待つことなく,stdinの監視がしたいです.例えば, whileループを回してる最中に,qがstdinに入力されたらbreakするけど,あとは普通に回る,みたいな感じにしたいです.fgetc(stdin)とすると,毎回入力を待つことになるので,待たないで回る方法が知りたいです. 具体的には,以下はgnuplotにsinカーブを表示するプログラムですが,コメントアウトしてある /* if((buf = fgetc(stdin)) == 'q'){ break; } */ の部分のようにすると毎回とまってしまいます.これを,毎回入力を待たずに,qを打ったら止まるようにするにはどうするのが普通なのでしょうか. 返信おまちしております. #include <stdio.h> #include <math.h> #include <unistd.h> FILE *gp; #define omega (M_PI/2) #define A 1 #define N 10 int i; int j; double x, t; int main(void) { gp = popen(gnuplot, "w"); fprintf(gp, "set xrange [0:11]\n"); fprintf(gp, "set yrange [-3.5:3.5]\n"); fprintf(gp, "set xlabel \"x\"\n"); fprintf(gp, "set ylabel \"y\"\n"); char buf; for (j = 0; j < N*160; ++j) { usleep(5000); /* if((buf = fgetc(stdin)) == 'q'){ break; } */ fprintf(gp, "plot '-' with lines linetype 1\n"); for (i = 0; i < j+1; ++i) { t = 0.1*i; x = A*sin(omega*t); fprintf(gp, "%f\t%f\n", t/10, x); } fprintf(gp, "e\n"); } fprintf(gp, "exit\n"); fflush(gp); pclose(gp); return 0; }

  • リダイレクションで標準入力を変更できない

    入門UNIXシェルプログラミングを読んで 今まで眠らせていたレッドハットのいろんな操作方法を学習しています。 今は第4章リダイレクションによるファイル操作を読み進めています。 >を使って標準出力を変更する方法を学習しました。 また、<を使って標準入力を変更する方法も学習しました。 しかし、本の例のとおりに入力しても、標準入力を変更できませんでした。 $cat xyz abc nnn $ls < xyz aaa abc nnn xyz xyzで指定したabc nnnのリストを表示させたいのに 全てのリストが表示されてしまいます。 つまり、< xyz以降が無視されて、引数なしのlsが実行されてしまいます。 他にも私が知ってるコマンド(echoやcat)でも標準入力が変更できるか試してみたのですが、やはりダメでした。 $ echo < xyz $ cat < xyz abc nnn echoは空行を表示します。 catの場合は、<だけが無視されてcat xyzとして実行されるようです。 どなたか教えてください。 このリダイレクションの使い方は合ってますよね。 どうやれば、標準入力を変更できるのですか。

  • シリアル通信について

    脳波測定器B3 Bandというものを購入しました。 http://neuro-bridge.com/dev/b3band.html linuxにbluetoothでつなげて、測定値を表示させたいです。 /dev/rfcomm0が対応するデバイスファイルのようです。 アクセス権限を付与して cat /dev/rfcomm0 としても bash: /dev/rfcomm0: デバイスもしくはリソースがビジー状態です と表示されてしまいます。 どうしたらB3 Bandから測定値を読めるでしょうか。

  • 特殊ファイル(special file)の扱い方

    岩波書店の「オペレーティングシステム」でOSの勉強をしているのですが、 「UNIXでは/devの下に入出力装置の名前が登録されている。 入出力装置にアクセスするためのこれらのファイルを UNIXでは特殊ファイルと呼んでいる。 特殊ファイルは、ファイルをパラメータとして指定できるコマンド および多くのシステムコールで指定することが出来る。・・」 と本にあります。 プリンタでの例が分かり易いかなと思い、特殊ファイルへのアクセスを 試そうとしましたが、使用しているプリンタが学内のネットワークに 繋がったプリンタであるためか、/devの下に名前がありませんでした。 (プリントアウトは普通に出来ます。) 初歩的な質問で恐縮ですが、特殊ファイル名を指定してアクセスする コマンドの例にはどんなものがあるのか、 簡単な物でいいので教えていただけないでしょうか。