- PR -

system関数の戻り値

1
投稿者投稿内容
oki
ベテラン
会議室デビュー日: 2004/12/18
投稿数: 55
投稿日時: 2005-03-16 20:30
お世話になります。松本と申します。

現在、Linuxで動作しているPerlとシェルをWindowsに移植しています。
WindowsにCygwinをインストールし、シェルは移植できたのですが
Perlからシェルを起動し戻り値を取得することができずに悩んでいます。

WindowsでPerlからシェルを起動し、戻り値を取得する方法を
ご存知の方がおられましたら、ご教授お願い致します。

WindowsのPerlとシェル

=======================
/usr/local/ap/abc.sh
※戻り値で1を返す
=======================
#!/bin/bash
exit 1

=======================
abc.cgi
※シェルを起動し戻り値を取得する
=======================
#!C:/Perl/bin/perl
local($result) = (system "bash /usr/local/ap/abc.sh");

$resultに「0」が入ってしまう。「1」がほしい。



コブラ
ぬし
会議室デビュー日: 2003/07/18
投稿数: 1038
お住まい・勤務地: 神奈川
投稿日時: 2005-03-16 23:43
system("/usr/local/ap/abc.sh");

孫シェルにせず、こうすれば、どうですかな?
oki
ベテラン
会議室デビュー日: 2004/12/18
投稿数: 55
投稿日時: 2005-03-17 00:03
ご返事ありがとうございます。

一部訂正。
シェルのパスが/usr/local/ap/abc.shではなく
c:/program files/ap/abc.shでした。(>_<)

system("c:/program files/ap/abc.sh");
で試してみましたが、起動できませんでした。(^^ゞ

cygwinでは
"c:/program files/ap/abc.sh"
で起動するのですが

コマンドプロンプトからは起動できず
bash "c:/program files/ap/abc.sh"
で起動できます。

頭にbashを付けてしまうと、シェルの戻り値が拾えないようです...

孫シェルの戻り値を拾う方法があればいいのですが...
ちいにぃ
大ベテラン
会議室デビュー日: 2002/05/28
投稿数: 244
投稿日時: 2005-03-17 00:30
どれが原因か判りませんが、途中まで調べたので、投稿します。

【注意】スクリプトに「$1」とか「¥n」を含んでいるので、それぞれ全角に置き換えています。


まず、シェルスクリプトの動作の確認。
引数をまんまexitで返すシェルスクリプトを用意します。

コード:
------------------ echoresult.sh
#!/bin/bash
exit $1
--------------------------------



これをbash上で動かしてみると…ちゃんと終了コードが返ります。

$ ./echoresult.sh 0; echo $?
0

$ ./echoresult.sh 1; echo $?
1

次に、Win32版Perlを使っておられることから、
たぶんsystemはcmd.exe (Windows 2000 Serverだから)を経由すると思うので、
cmd経由の動作を確かめます。

C:¥> cmd /C "bash echoresult.sh 0" && echo success
success

C:¥> cmd /C "bash echoresult.sh 1" && echo success

cmd経由でもちゃんと終了コードが渡るようです。

# もしcmdではなく、command.com経由だったら終了コードは
# まともに返ってこなかった(常に0)と思うのですが、
# 確かめていません。


ついでに、Cygwinのperlで同様のことをやってみました。

コード:
------------------ echoresult.pl
#!/usr/bin/perl
use strict;
sub print_result($) {
    my $result = shift;
    print "result=", $result, "¥n";
    print "exitcode=", ($result >> 8), "¥n";
    print "signal=", ($result & 127), "¥n¥n";
}
my $result;
$result = system "echoresult.sh 0";
print_result($result);
$result = system "echoresult.sh 1";
print_result($result);
$result = system "echoresult.sh 2";
print_result($result);
--------------------------------



Cygwinのperlでは、ちゃんと値が返ってきます。

$ ./echoresult.pl
result=0
exitcode=0
signal=0

result=256
exitcode=1
signal=0

result=512
exitcode=2
signal=0
1

スキルアップ/キャリアアップ(JOB@IT)