• 締切済み

標準エラー出力の可否操作について

unix-cプログラムにてpopen()等により実行した結果、 popen()の引数に設定したコマンドのパスが設定されていない場合 標準エラー出力をはいてしまいます。 close(2)を実行することにより出力はまぬがれるのですが、 他箇所の標準エラー出力は表示させたいためclose(2)では実現できません。 何かpopen()実行時の標準エラー出力をさせず処理を進める良い方法はありませんでしょうか

  • sting
  • お礼率12% (35/274)

みんなの回答

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.2

/dev/nullは入力データを捨てるための特殊デバイスです。 > popen()の引数ないに 2> /dev/nullと直接書いても 少し危険ですね。 環境変数SHELLが/bin/tcshだったりすると動作しません。 (標準エラー出力のリダイレクト方法が違うため) 「sh,bash,ksh以外のシェルは使わない!」と言う仕様ならオッケーだと思います。

  • toysmith
  • ベストアンサー率37% (570/1525)
回答No.1

・popenを使わず自前でpipeを制御する forkした後、子プロセス側でclose(2)すれば親プロセスのstderrを生かせたまま子プロセスのstderrを殺せます。 ・popenで起動させるプログラムをシェルスクリプトにする シェルスクリプト内で標準エラーを殺しておくだけです。 #!/bin/sh ls $* 2> /dev/null みたいな感じで。 方法は他にもありそうですね。

sting
質問者

お礼

popen()の引数ないに 2> /dev/nullと直接書いても 上手くいきました。 これでちょっとやってみようと思います。 ところで /dev/nullってどんな意味をもつのでしょうか?

関連するQ&A

  • コマンド実行結果のエラー標準出力制御について

    unix-cにて子プロセスにてexecvp()を使用しmailxコマンドを実行し、親プロセスにてmailxコマンドの実行結果に出力処理をしたいのですが、 どんなことがあろうと(パスが違うなど)標準出力させたくありません。 現在、fork(),pipe()を駆使して正常系は上手くできるようになったのですが、エラー時の標準出力(親、子とも)を防ぐことが できません。何か良い方法はないでしょうか?

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

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

  • popen使用時のエラー出力を出したくない

    popen( "コマンド", "r" ); このときコマンド実行時のエラー出力を出さないようにしたんですけど、 popen( "コマンド >& /dev/null", "r" ); とすると、 sh: /def/null: 番号が正しくありません。 となってしまいます。 これは、どういうエラーなんでしょうか? とにかく、プロンプトに余計なエラーを出したくないのですが、どうすれば消えるでしょうか?

  • DOSコマンドで、標準出力を出力しないようにするには?

    Windowsのバッチファイルでコマンドを実行する際、標準出力をディスプレイに表示したくないのですが、どのようにするのが、一般的なのでしょうか? CDで実行するので、ファイルに出力はしたくありません。 UNIXとかだと、nullにパイプするようなのですが…。

  • Cシェルで標準エラー出力への出力方法を教えてください。

    Cシェルにおいて、通常echo文は標準エラー出力へ表示されます。 echo文のように引数で指定した文字列を標準エラーとして出力するような コマンド?があったら教えてください。 c言語では fprintf(stderr,"test!\n"); などとやりますが、Cシェルではありますでしょうか?

  • 標準エラーと標準出力をファイルに順番に保存するには?

    こんばんは、 OSのコマンドをperlから実行して、結果をファイルに出力した 場合、(` `, system()) 標準出力と標準出力エラーが、画面に表示した時のように 順番に保存してくれません。 バッファーの関係でしょうか? どのようにしたら、画面に表示した時のように順番に ファイルに保存できるでしょうか?

  • 標準出力、標準エラー出力 以外の出力??

    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 宜しくお願いします。

  • 標準出力と標準エラー出力を変数にセットしたいです。

    始めたばかりの初心者の為、変な質問でしたら申し訳ありません。 標準出力と標準出力を別々の変数にセットしたいのですが、そのやり方が分からず困っています。 やりたいことは、 コマンド(diffやcatなどの)実行結果の標準出力と標準エラー出力を それぞれ「任意の文字_受取パラメータの値」にセットすることをしたいです。 下記は、1回ファイルに出力して、それを読んで変数にセットするように記述したものです。 ※記述間違っていたらすみません。 ファイルに書かなくても、パイプやその他コマンドなどで出来る方法はないでしょうか? ex) test.sh 1.txt 2.txt TEST01 で実行 #!/bin/sh parm1 = $1 parm2 = $2 parm3 = $3 diff "${parm1}" "${parm2}" > test.log 2> err.log eval w_stdout_${parm3}=¥`cat test.log¥` eval w_stderr_${parm3}=¥`cat err.log¥` eval echo "stdout:¥"¥{w_stdout_${parm3}}¥"" eval echo "stderr:¥"¥{w_stderr_${parm3}}¥"" ※実行した結果 stdout:diff結果 stderr:空白 お手数ですが、何卒宜しくお願い致します。

  • 標準出力先を変える

    Windowsで作ったソフトをコマンドラインから実行するときに例えば prog.exe > test.txt のようにするとリダイレクトして標準出力をtest.txtにすることは出来ますが、これをプログラムの中で変えることは出来ますか?

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

    画面への文字出力が、標準出力(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として何らかの設定を行うことで、 ファイルに落とした時も、出力された文字が時系列に保存されるように する方法はあるでしょうか? よろしくお願いします。

専門家に質問してみよう