end0tknr's kipple - 新web写経開発

http://d.hatena.ne.jp/end0tknr/ から移転します

標準出力、標準エラー出力

perlの場合、STDOUTやSTDERR

perlで標準出力や標準エラー出力へ出力するにはSTDOUTやSTDERRを使用します。

#デフォルトでは標準出力へ
print "This is standard output\n";

#STDOUTを指定すると、標準出力へ
print STDOUT "This is standard output\n";

#STDERRを指定すると、標準エラー出力へ
print STDERR "This is standard error output\n";

また、apacheの場合、STDERRの内容はerror_logへ書き込まれる為、print STDERR "hogehoge" のような debug writeを入れている人も多いと思います。

bashの場合、STDOUTは1番、STDERRは2番へ

bashの場合、STDOUTは1番、STDERRは2番で出力される為、その内容をファイルに書き込むには次のように行います。

#STDOUT, STDERRをそれぞれ別ファイルに書き込む
$ command 1>file1 2>file2
#STDOUT, STDERRを同じファイルに書き込む
$ command 2>&1 > file12

画面出力とファイル書込を同時に行いたいのであれば、tee コマンド

STDOUTやSTDERRの内容を画面出力すると同時にファイル書込みたい場合、tee コマンドを使用します。

$ command 2>&1 | tee log_file

perlのopen関数によるSTDOUTやSTDERRとのデータの受け取り

perlのopen関数で、STDOUTからデータの受け取ったり、STDOUTへ渡す場合は次のように行います。

#!perl  #active perl for win

#### ls -lの内容をopen関数で受け取る
my $command = "ls -l |";
open my $fh, $command or die "can't open $command:$!";

for my $line ( <$fh> ){
    print "perl write : $line";
}
close $fh or die "can't close $command:$!";
#!perl  #active perl for win

#### STDERR の内容をopen関数で渡す
my $command = "| tee log_file";

open my $fh, $command or die "can't open $command:$!";
print $fh "PERL WRITE\n";
close $fh or die "can't close $command:$!";