- ベストアンサー
tarコマンドのリターン値
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元はディレクトリ配下の複数のファイルを*で圧縮しようとしています。
- みんなの回答 (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から読み込む
その他の回答 (2)
- ishi7474
- ベストアンサー率32% (71/216)
とりあえず、標準出力と標準エラー出力を/dev/nullに捨てずに、 何かのファイルに書いて原因をつきとめる必要があると思います。 よくあるケースとして、"tar czvf /dir1/*"等とした場合、/dir1 以下に存在するファイル数が多過ぎて、ファイルリストがシェル のコマンドライン長の制限を越えることがあります(ワイルドカード はtarコマンドに渡される前に、bash等のシェルがファイル名の リストに展開します)。 そういう時は"tar czvf /dir1/"等と、ワイルドカードを使わない 指定を考えます。
お礼
ありがとうございます。 ファイルリストのコマンドライン長の制限はまったく 気がつきませんでした。 確かに数のあるディレクトリもあるので怪しそうです。
- tatsu99
- ベストアンサー率52% (391/751)
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/production/doc_disp.cgi?category=43&doc=jnav000219
お礼
ありがとうございます。 参考にさせていただいて linuxでのステータスについて探してみます。
お礼
ありがとうございます。 tatsu99さんのアドバイスにもありましたが ビットシフトしていたりしているのですね。 またishi7474さんの所でもファイルリストの 制限などの話も伺いまして、tarの指定の仕方などに 検討の余地がありそうです。