標準出力と標準エラー出力を変数にセットする方法とは?

このQ&Aのポイント
  • 始めたばかりの初心者の為、標準出力と標準エラー出力を別々の変数にセットする方法が分からず困っています。
  • コマンド実行結果の標準出力と標準エラー出力を任意の変数にセットしたいです。
  • 現在はファイルに出力してから変数にセットしていますが、ファイルを使用せずに直接変数にセットする方法はありますか?
回答を見る
  • ベストアンサー

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

始めたばかりの初心者の為、変な質問でしたら申し訳ありません。 標準出力と標準出力を別々の変数にセットしたいのですが、そのやり方が分からず困っています。 やりたいことは、 コマンド(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:空白 お手数ですが、何卒宜しくお願い致します。

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4848/10262)
回答No.1

基本的には無理ですね。 無理矢理やると、絶対に出力に現れない文字列があるとして、例えば ==:===:=== A=$(sh -c "diff ${parm1} ${parm2} | (sleep 1 ; echo -n ==:===:=== ; cat) | cat " 2>&1) STDOUT=${A##*==:===:===} STDERR=${A%%==:===:===*} コマンドの実行時間より長くsleepしてください。

maruko_o
質問者

お礼

ご回答ありがとうございました。

関連するQ&A

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

    例として、perlなどで、(test.plとします)  print "stdout1\n";  print STDERR "STDERR1\n";  print "stdout2\n";  print STDERR "STDERR2\n";  print "stdout3\n";  print STDERR "STDERR3\n"; このように、標準出力と、標準エラー出力が混在した状態の処理があった場合、 コマンドプロンプト(Windows2000)にて、 C:\>test.pl とすると、 stdout1 STDERR1 stdout2 STDERR2 stdout3 STDERR3 のように時系列に出力されますが、これをログファイルに取ろうとして、 C:\>test.pl 1>log.txt 2>&1 とすると、 C:\>cat log.txt STDERR1 STDERR2 STDERR3 stdout1 stdout2 stdout3 のように、標準エラー出力が先に吐き出されてしまいます。 これを画面出力時と同様に時系列で取れるようにしたいのですが、どのようにすれば良いでしょうか? 単純なことで困っています。よろしくお願いします。

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

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

  • PHP5の外部コマンド実行で、バッチファイルのエラーレベル値と標準出力(標準エラー?)の3つを取得できる関数はありますか?

    PHP5のWindows版を使っています。 外部コマンドを実行して、Windowsのバッチファイルのエラーレベル値と標準出力(標準エラー?)の3つを取得できる関数はありますか? test.cmdの中味 echo 標準出力内容です。 echo バッチファイルで標準エラー出力はわかりませんが exit /b 2 list ($ret, $stdout, $stderr) = 何か関数("test.cmd") echo $ret; // 2 echo $stdout; // 標準出力内容です。\nバッチファイルで標準エラー出力はわかりませんが echo $stderr; // ???? よろしくお願い致します。

    • ベストアンサー
    • PHP
  • Cシェルで標準エラー出力への出力方法を教えてください。

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

  • 標準出力とログファイルへの書き出し

    初歩的な質問ですみません。 以下のようにするとログファイルにechoの内容が出力 されますが、標準出力には出力されないようになります。 echo "log" >> test.log 標準出力とログファイル両方に出力したい場合はどのように記述 すればよいでしょうか?

  • system で実行したプログラムの標準出力を変数で受け取りたい

    実行結果を標準出力に出力する cプログラム A があります。 perl から system を利用して A 呼び出し、その実行結果を perl で加工する仕組みを考えています。 今のところ、標準出力を一旦変更して、テンポラリのファイルに出力させ、再度そのファイルをオープンして perl で利用するという形で何とか実現できています。 open (SAVESTDOUT, ">&STDOUT") or die "..."; #(1) open (STDOUT, ">$tempFile") or die "..."; #(2) system "A"; #(3) close(STDOUT) or die "..."; #(4) open(STDOUT, ">&SAVESTDOUT") or die "..."; #(5) という感じです。 一旦テンポラリーのファイルを介するところがスマートでないので、直接変数に標準出力結果を落したいです。 (1) そのまま (2) 標準出力を perl の変数に変更 (3) そのまま (4) なし (5) そのまま といった感じで実現したい(もちろんより良い解法があれば尚宜しいです)のですが、可能でしょうか? ご教授ください。宜しくお願いします。

    • ベストアンサー
    • Perl
  • echoの出力は標準エラー出力ですか?

    例えばsamp.cshのようなc-shellスクリプトを作成、 samp.csh | less のようにすると、echoの行が表示されないのに対して samp.csh |& less とすると表示されました。 echoは例によって色々なバージョンがありそうですが、man を見る限りechoの出力に関して特別な記述が有りません。 echo is a shell built-in /usr/local/bin/echo /bin/echo /usr/bin/echo /usr/ucb/echo echoコマンドはデフォルトで標準エラー出力なのでしょうか?これを標準出力にするオプションは無いのでしょうか?もしくはどのエコーを使うと解決するのでしょうか? --[samp.csh] #! /bin/csh -f foreach a ($aa) echo "$a" diff $work/$a $TRY1_CENTER/syn/ end システム Release: 5.7 Kernel architecture: sun4u Application architecture: sparc Kernel version: SunOS 5.7 Generic 106541-17 June 2001

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

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

    • ベストアンサー
    • Perl
  • Rubyのpopen3について

    はじめまして Rubyをはじめて1か月の初心者です。 popen3を使用するにあたって大変困っております。 popen3で外部コマンドを実行して、実行結果の標準出力をファイルとして格納しようと思っています。 外部コマンドの内容は、SSH接続でサーバへログインし、そこにあるシェルスクリプトを実行させるもので、 呼び出すシェルスクリプトに対して、Rubyから標準入力を渡し、シェルスクリプトが標準入力を受け取り、 それをもとに呼び出したシェルスクリプトがさらに別のシェルスクリプトを呼び出し、実行結果を標準出力としてRubyで受け取ってファイルに格納したいと思っています。 ソースとしては、以下のようにしてますが、標準入力を引き渡す方法が分かりません。 その為、標準入力を引き渡す部分は記述していません。 Open3.popen3('ssh localhost sh test.sh ') do |stdin, stdout, stderr|   begin    loop do     IO.select([stdout,stderr]).flatten.compact.each { |io|      if stdout != "" then       stdout_lines = stdout        puts("stdout_lines = " + stdout_lines)      end      stderr_lines = stderr if stderr != ""      puts("stderr_lines = " + stderr_lines)     }     break if $stdout.classed? && $stderr.closed?   end   rescue EOFError   end end JRubyの1.6.8なので、Rubyのバージョンは1.8.7相当です。 なにぶん初心者の為、なにをどうすれば良いか分からない状態です。 まず、実現が可能かを知りたいです。 実現可能であれば、標準入力を引き渡す方法を教えていただきたく。 よろしくお願いします。

  • 標準出力について

    シェルでシェルを呼び出す処理をバックグラウンドで行っています。その処理を行っている時にログアウトすると、ttyが"?"となってプロセスが残ります。 ここで質問なのですが、この"?"となったプロセスからの標準出力はどこに行われるのでしょうか? 簡単なシェルを書きますと、 TEST1.sh・・・・ #!/bin/sh TEST2.sh & exit 1 TEST2.sh・・・・ #!/bin/sh while true do echo "TEST" done exit 1 で、TEST1.shを呼び出します。 簡単に書くと上記の様な処理となりますが、echo "TEST"はどこに出力されるのか分かる方がいらっしゃいましたらご教授下さい。よろしくお願いします。