- ベストアンサー
smbclientの戻り値を取得
お世話になります。perlプログラムからshellを呼び出して shellでsmbclientを呼び出すのですが、smbclientの戻り値を 受け取るにはどうしたらよいでしょうか? test1.pl $re = system "sh test1.sh"; test.sh smbclient //host/dir -U user%passwd put ... put ... exit イメージはこんな感じです。 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> エラー:256がかえりました。 ほうほう、なるほどね。 これは恐らくC言語と同じ仕様なのだと思うね。GNUのLIBCにおいて、system()関数の戻り値は、上位バイトにこのリターンコードが入っている。つまり、シェルスクリプトが通常終了し、smbclientが1を返す→シェルスクリプトが1を返すと、Perlのsystem関数の戻り値は、上位バイトが1、下位バイトが0で256になるんだろうね。 実際、C言語では上位バイトを取るという話ではなく、論理的なマクロを使うのだが、現行のシステムでは単純に8ビット右にシフトまたは256で割った商で良い。 test1.pl system "sh test1.sh"; print $?; ←ここで$?の値を右に8ビットシフトしてあげると良い 当方、実はPerlはほとんど分からないので、シフトの方法は頑張ってちゃぶだい。
その他の回答 (1)
- anmochi
- ベストアンサー率65% (1332/2045)
ふみゅ? perlからシェルスクリプトを呼び出すのね? すると、この問題は「シェルスクリプトで直前コマンドの返り値を取得する方法」となるよね。 bashのシェルスクリプトでは、直前のコマンドの返り値は$?というシェル変数でアクセスできる。 smbclient hogehoge gehogeho echo $? 後は、この$?を何かに保存すれば良い。
補足
ご回答有難うございます。 希望の戻り値を取得する事が出来ました!が、perlに戻り値を渡せないでいます。 test1.pl system "sh test1.sh"; print $?; とすると、正常:0、エラー:256がかえりました。 test.sh smbclient //host/dir -U user%passwd put ... echo $? 同様に、とすると、正常:0、エラー:1がかえりました。 >bashのシェルスクリプトでは、直前のコマンドの返り値は$? perlでも同じ意味だったので、やってみたのですが こんな横着はできないのでしょうか・・
お礼
anmochi様、有難う御座います。 丁寧な回答で大変よくわかりました。 perl内で$?取得した値が、上位ビットでありながらsmbclientの戻り値を返していることが わかりました。 sh内の$?を出力して、perlで読み込むような術は避けたかったのでとても助かりました。 又よろしくお願い致します。