Perlでpsqlコマンドを実行して戻り値を取得する。

という簡単なスクリプトだったはずなのに
ややこしいコマンドを叩いていたため非常にハマった。

$ echo "show work_mem" | psql -U user -h host_name dbname | sed '/^$/d' | sed 's/^ *\(.*\)/\1/g'

なんていうコマンドの戻り値を取ろうとしていたんだけど
接続失敗しても戻り値が0になってしまう。
psql単体でみると戻り値2なんだけどなぁ・・・・と悩んでいたんだけど
ガリガリ君食って落ち着いたら最後のコマンドの戻り値(この場合は「sed '/^$/d' | sed 's/^ *\(.*\)/\1/g'」の部分)
が戻ってくるんだからそりゃ0だわな。ということに落ち着き、
最後のsedの部分をPerlに処理させる方向でコマンドをこんな形に直し・・・・

$ echo "show work_mem" | psql -U user -h host_name dbname 

Perl側でこんな感じに処理してsedの代わりとした。

    $cmd = "$sql_cmd | psql -U $config{user} -h $config{host} -p $config{port} -t $config{dbname}" ;

    open ( PSQL , "$cmd |") or die "psql run error. check connect setting!";
    my $n = 0 ;
    my @line = ();
    while( <PSQL> ){
        chomp;                #後方の空白および改行を削除
        $_ =~ s/^ *(.*)/\1/g; #先頭の空白を削除
        if(!/^$/){
            $line[$n++]=$_;
        }
    }
    close( PSQL );
    if ( $? ) {
        print "psql run error. check connect setting!\n";
        exit 1;
    }

Perlではコマンド実行用にパイプを開いたらCloseするときに戻り値が
$?で取れるらしい。ややこい。(゚ω゚ )