Linuxコマンドで使用されているtarにてtarファイルを作成するシェルスクリプトを作成したのですが、あるファイルを実行すると戻り値が0ではなく1でかえってくることがありました。
tarのバージョン
$ tar --version
tar (GNU tar) 1.23
Copyright (C) 2010 Free Software Foundation, Inc.
使用許諾 GPLv3+: GNU GPL version 3 またはそれ以降 http://gnu.org/licenses/gpl.html
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
[参考訳]
これはフリーソフトウェアです. 変更と再配布は自由です.
法律で認められる範囲で「無保証」です.
作者: John Gilmore, Jay Fenlason.
Shellスクリプト
試験のため、tarで圧縮して結果をechoで出力しています。
#!/bin/sh
tar cvfz /tmp/test.tar.gz /var/log/***.log
echo "exit code = $?"
実行結果
通常の場合
tar: メンバ名から先頭の `/' を取り除きます
/var/log/***.log
exit code = 0
失敗する場合
どうやらファイル圧縮中にファイルの内容が変更された場合は1、削除された場合は2を返すようです。
tar: メンバ名から先頭の `/' を取り除きます
/var/log/***.log
tar: /var/log/***.log: 読み込んだファイルが変更されています
exit code = 1
/tmp/test.sh
tar: メンバ名から先頭の `/' を取り除きます
tar: /var/log/***.log: stat 不能: そのようなファイルやディレクトリはありません
tar: 前のエラーにより失敗ステータスで終了します
exit code = 2
マニュアル
こちらにて戻り値について記載されていました。
0
‘Successful termination’.
1
‘Some files differ’. If tar was invoked with ‘--compare’ (‘--diff’, ‘-d’) command line option, this means that some files in the archive differ from their disk counterparts (see section Comparing Archive Members with the File System). If tar was given ‘--create’, ‘--append’ or ‘--update’ option, this exit code means that some files were changed while being archived and so the resulting archive does not contain the exact copy of the file set.
2
‘Fatal error’. This means that some fatal, unrecoverable error occurred.
ファイル圧縮中に起こった変更はは警告として表示しているようです。
対策
exit codeが0、1以外をエラーとする設定に変更で対応します。
#!/bin/sh
tar cvfz /tmp/test.tar.gz /var/log/***.log
exitcode=$?
if [ "$exitcode" != "1" ] && [ "$exitcode" != "0" ]; then
#エラー処理
fi
標準出力には【tar: /var/log/***.log: 読み込んだファイルが変更されています】等の警告が表示される場合があります。
標準出力から警告メッセージを非表示にする場合は--warningで対応することでいけるようです。
tar -cvfz --warning=no-file-changed /tmp/test.tar.gz /var/log/***.log
※warningをつける際はcvfzもマイナス【-】をつけないとうまく動作しないので注意
warningのオプションはこちらから参照できます。