はちゅにっき

こっちのブログはまったり更新

コマンドの実行結果を取得したい!

STDOUT も STDERR も両方とも、でも別々に取得したい!
そんなワガママな私にもアナタにも

IO-CaptureOutput
http://search.cpan.org/~dagolden/IO-CaptureOutput-1.1101/lib/IO/CaptureOutput.pod

たとえばこんなスクリプトを実行すると

use Perl6::Say;
use Data::Dumper;

my $read = `gcc`;
say Dumper($read);

# => gcc: no input files
# => $VAR1 = '';

と、$read には STDERR の内容が代入されないため、画面にむなしく gcc: no input files の文字だけが表示されることに。。。
ほかにも

use Perl6::Say;
use Data::Dumper;

my $read = readpipe('ps -u');
say Dumper($read);

# => Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ
# => $VAR1 = 'USER PID %CPU ... (ps の実行結果がずらずらと)'

なーんてふうに、STDOUT の内容は取得できるんだけど、STDERR の内容は取得することができなかったり。


これに対処するために、STDOUT と一緒にパイプで STDERR を開くなんて技もあるみたいだけれど、それをやってしまうと、どれが STDOUT に出力されたもので、どれが STDERR に出力されたものなのか分からなくなりそうな?


そんなときに、この IO::CaptureOutput を使うと...

use IO::CaptureOutput qw( capture_exec );
use Perl6::Say;

my ($stdout, $stderr) = capture_exec('ps', '-u');

say $stderr;
# => Warning: bad syntax, perhaps a bogus '-'? See /usr/share/doc/procps-3.2.7/FAQ

say $stdout;
#=> ... (ps の結果がずらずらと)

と、STDOUT と STDERR の出力結果を別々に取得することができます。


やったね!わーい。


あ、詳しいつづきはCPANで!