プロが教える店舗&オフィスのセキュリティ対策術

RedHatlinux AS3.0でperl内部でsystemコールでtarコマンドを
発行していますが
$result = system "tar czvf・・・ 1> /dev/null 2> /dev/null"
の結果として$resultの値に512という値が入ることがあります。
実際、tarファイルの作成には成功しているので0が返ってきて
それ以外をエラーとして判定するように期待していたのですが
上記の通りの値になってtar成功に関わらずエラーと判断して
しまいます。
この512というリターン値は何なのでしょうか?

なお、単純にsystemで簡単なtarをすると0で普通に返ってきたりします。またtar元はディレクトリ配下の複数のファイルを*で圧縮しようとしています。

A 回答 (3件)

FreeBSDですが、


% perldoc -f system
すると、system関数のマニュアルが見られます。(Linuxにもあるんじゃないかな)
そのサンプルスクリプトでは、

printf "child exited with value %d\n", $? >> 8;

なんてしているので、exitステータスは、8bit shiftする(256で割る)
必要があるんですね。

# 検索すると同様の説明が他数あると思います。

>実際、tarファイルの作成には成功している
対象ファイルが全て入っていますか?

全ての対象ファイルが含まれていないtarファイルになっているんじゃないでしょうか。
ファイルリストを作ってtar の"-T"オプションで読み込むか、ディレクトリ名だけを指定するのが無難じゃないですかね?

>-T, --files-from F
> 抽出又は作成するファイルの名前をファイルFから読み込む
    • good
    • 0
この回答へのお礼

ありがとうございます。
tatsu99さんのアドバイスにもありましたが
ビットシフトしていたりしているのですね。
またishi7474さんの所でもファイルリストの
制限などの話も伺いまして、tarの指定の仕方などに
検討の余地がありそうです。

お礼日時:2007/05/28 19:01

とりあえず、標準出力と標準エラー出力を/dev/nullに捨てずに、


何かのファイルに書いて原因をつきとめる必要があると思います。

よくあるケースとして、"tar czvf /dir1/*"等とした場合、/dir1
以下に存在するファイル数が多過ぎて、ファイルリストがシェル
のコマンドライン長の制限を越えることがあります(ワイルドカード
はtarコマンドに渡される前に、bash等のシェルがファイル名の
リストに展開します)。
そういう時は"tar czvf /dir1/"等と、ワイルドカードを使わない
指定を考えます。
    • good
    • 0
この回答へのお礼

ありがとうございます。
ファイルリストのコマンドライン長の制限はまったく
気がつきませんでした。
確かに数のあるディレクトリもあるので怪しそうです。

お礼日時:2007/05/28 18:59

perlの場合、tarの戻り値を知るためには、systemのreturn値を256で悪必要があります。

従って512÷256=2ですので、tarの終了ステータスは2と言うことになります。
tarの終了ステータスは、参考URLを参照下さい。
(但しHP-UX11.0ですので、linuxと同じかどうかの保証は私は出来ませんので、ご了承下さい)

参考URL:http://h50221.www5.hp.com/cgi/service/knavi/prod …
    • good
    • 0
この回答へのお礼

ありがとうございます。
参考にさせていただいて
linuxでのステータスについて探してみます。

お礼日時:2007/05/28 18:57

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!