スクリプト内の tar の動作が手動で tar を使用した場合と異なるのはなぜですか

スクリプト内の tar の動作が手動で tar を使用した場合と異なるのはなぜですか

私は電子メールとクラウド サービスのバックアップ スクリプトを作成しています。
簡単にするために、ここではメール バックアップ部分のみを投稿しました。

基本的に、いくつかの仮想ボックスが稼働しているホストマシンがあります。
これらの仮想ボックスは/mnt/alias/storage/、vmail フォルダ (私の場合は shishaMail と呼ばれます) がある ホストマシンにアクセスします。

(以下は必須情報ではないかもしれません)
中にあるものはすべて、素敵な名前の付いたフォーム/mnt/alias/です。 このラック フォルダーには、ドライブのマウントがあります。ln -s/mnt/rack/*

(不要な情報終了)

これが私のスクリプトです

#!/bin/bash
# backup script 

BASEURL="/mnt/alias/backup"
MAILURL="/mnt/alias/storage/shishaMail"

DAY=`eval date +"%d"`
MONTH=`eval date +"%m"`
YEAR=`eval date +"%Y"`
HOUR=`eval date +"%H"`
MINUTE=`eval date +"%M"`

PIMPURL=$BASEURL/$YEAR/$MONTH/$DAY/

COMMAND1="cd $PIMPURL"
$COMMAND1 2>/dev/null

if [ $? -eq 0 ]
then
                echo "Command 1 was successful"
else
                echo "There ain't folders!!"
                echo "I'll mkdir some!"

                COMMAND2="mkdir -p $PIMPURL"
                $COMMAND2 2>/dev/null
fi
if [ $? -eq 0 ]
then
                echo 'Command 1 or/and 2 was successful'
                echo "STARTING MAIL BACKUP"

                COMMAND3="tar -cvzf '"$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz' "$MAILURL
                echo $COMMAND3
                $COMMAND3 2>/dev/null

                if [ $? -eq 0 ]
                then
                                echo 'MAIL BACKUP SUCCESSFULL'
                else
                                echo "FAILURE!!"
                fi
else
                echo 'Nope! Must be some kind of strage Err0r!!'
fi

したがって、このスクリプトを実行すると、次のエラーが発生します。

コマンド 1 が成功しました
コマンド 1 または 2 が成功しました
メールのバックアップを開始しています
tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz' /mnt/alias/storage/shishaMail
tar: メンバー名から先頭の `/' を削除しています
tar (子): '/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': 開けません: そのようなファイルまたはディレクトリはありません
tar (子): エラーは回復できません: 終了します
失敗!!

ご覧のとおり、echoCOMMAND3 は次のようになります。

tar -czvf '/mnt/alias/backup/2014/06/13/shisha_10_21_.data.tar.gz' /mnt/alias/storage/shishaMail

また、このコマンドを手動で実行すると、スクリプトを実行するのと同じユーザー (どちらの場合も root) として、スクリプトは動作します。ファイル以外のディレクトリは存在し、このファイルは によって作成される必要がある
ため、スクリプトがファイルまたはディレクトリが存在しないとエラーを出す理由がわかりません。 *.tar.gztar

答え1

COMMAND3 作成行から一重引用符を削除してみてください。

COMMAND3="tar -cvzf "$PIMPURL"shisha_"$HOUR"_"$MINUTE"_.data.tar.gz "$MAILURL

その行を手動で実行すると、tar が引数を認識する前にシェルが引用符を削除します。

ファイル名にスペースを挿入しないので、引用符は必要ありません。実際には、その行をもう少し簡略化することができます。

COMMAND3="tar -cvzf ${PIMPURL}shisha_${HOUR}_${MINUTE}_.data.tar.gz ${MAILURL}"

中括弧は変数名を区切るためのもので、そうしないと 'PIMPURLshisha' を展開しようとするため、おそらく望んでいる結果にはなりません。中括弧を使用すると変数が目立つようになり、見つけやすくなるため、使用しても問題はありません。

関連情報