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
$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するときに戻り値が
$?で取れるらしい。ややこい。(゚ω゚ )