- PR -

> /dev/null/ を使って出力?

1
投稿者投稿内容
emi12
会議室デビュー日: 2008/11/10
投稿数: 2
お住まい・勤務地: 横浜
投稿日時: 2008-11-11 00:24
11月から未経験でIT企業に転職した者です。
今、研修中で色々な課題を与えられており進みが遅いので帰宅してからも課題に取り組んでいます。

今、UNIXの環境でJava言語の課題をしているのですが今日会社でかなり悩んで帰宅してからも解らず困っています。
今週ずっと研修担当の方が居ないので聞くことも出来ないので、基本的なことだと思うのですが教えてください。

例えば下の様なソースコードがあって

class Test{
public static void main(String args[]){
System.out.print("abcdef");
}
}

普通にコンパイルして「java Test」で実行すると「abcdef」と画面出力されますよね。
これを「java Test > /dev/null/」と実行した時にも「abcdef」と出力するようなソースコードを作れという課題に悩んでいます。
参考書やWEBで調べても「/dev/null/」はゴミ箱のことくらいとしか理解出来ません。
コードを変えずに「java Test > /dev/null/」とすると標準出力がゴミ箱に捨てられるということでしょうか?
nullのディレクトリにある出力結果を表示させる様にするコードにすればいいのですか?

基本的なことすぎるのかもしれませんが教えてください。
よろしくお願いします。
スフレ
ぬし
会議室デビュー日: 2005/05/27
投稿数: 281
お住まい・勤務地: 東京
投稿日時: 2008-11-11 00:56
/dev/nullはゴミ箱というかブラックホールなので、そこに入れたものを取り出すことはできません。

「> /dev/null」によって標準出力が画面ではないところにリダイレクトされているわけですから、標準出力を使うかぎりどうにもできません。System クラスのリファレンスにざーっと目を通してみてください。
未記入
常連さん
会議室デビュー日: 2007/06/22
投稿数: 44
投稿日時: 2008-11-11 01:01
標準エラー出力を使うだけでは?
angel
ぬし
会議室デビュー日: 2005/03/17
投稿数: 711
投稿日時: 2008-11-12 09:35
こんにちは。
「標準出力が捨てられる」というのは曖昧な理解になりますので、UNIXの動きとして補足します。ちなみに /dev/null/ ではなく /dev/null です。( ディレクトリではなくファイル )

UNIXでは、ファイル・ソケット等のI/Oは、「ファイルディスクリプタ」という数値を通じて管理されます。
その中でも、0,1,2 はプロセス起動時から使えるという暗黙のお約束があり、それぞれ「標準入力」「標準出力」「標準エラー」と呼ばれます。
この 0,1,2 の入力元や出力先がどこかは、その時の状況によります。
シェルを通じてコマンド入力してプロセスを起動したような状況では、0,1,2 全て、/dev/pts/XX というような特殊ファイル ( 間接的に、キーボードからの入力・画面への出力に相当 ) に割り当てられています。

そのため、java の System.out.print では、/dev/pts/XX を通じて画面へ文字が出力される結果となります。

ところで、java 〜 >/dev/null ( >/dev/null は 1>/dev/null と同じ ) のようにリダイレクトを指定すると、1 ( 標準出力 ) の先が、指定した /dev/null に差し替えとなります。ここで、/dev/null は出力された内容をただ捨てるだけの特殊ファイルですので、結果的に「標準出力が捨てられた」状況となります。

今回の問題では、まだ /dev/pts/XX に割り当てられているファイルディスクリプタがありますので、それを使うようなプログラムにすれば良い、ということになるでしょう。

※以下余談
 more < /etc/passwd ( </etc/paswd は 0</etc/passwd と同じ ) のようなコマンドでは、標準入力 0 が /etc/passwd に差し替えとなりますが、依然 q, <SP> といったキーボードからの入力を受け付けます。これは何番のファイルディスクリプタを使うでしょうか?

※追記・訂正
 上で /dev/pts/XX と書いていますが、OSや状況によっては別のファイルになります。コンソールでログインした時の /dev/ttyX 等の事をすっかり忘れていました…。また、 /dev/pts/XX は UNIX98 pty 使用時の名前なので、BSD pty では別の名前が使われます。

[ メッセージ編集済み 編集者: angel 編集日時 2008-11-12 20:19 ]
emi12
会議室デビュー日: 2008/11/10
投稿数: 2
お住まい・勤務地: 横浜
投稿日時: 2008-12-07 18:33
お礼のコメントが遅くなり申し訳ありません

スフレさん、未記入さん、angelさん、ご指導ありがとうございました。
単純に標準エラーを使うだけだったのですね。
System クラスのリファレンスを見てネットで調べて理解出来ました。

angelさん、丁寧な説明感謝しています。
(dev/nullの間違いでしたね。)

また、まだまだ勉強中で質問させて頂くと思いますので宜しくです。
1

スキルアップ/キャリアアップ(JOB@IT)