スクリプトのtarが手動でtarを使用するのとは異なる動作をするのはなぜですか?

スクリプトのtarが手動でtarを使用するのとは異なる動作をするのはなぜですか?

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

デフォルトでは、いくつかの仮想ボックスが実行されるホストシステムがあります。これらの仮想ボックスは、vmailフォルダ(私の場合はshishaMailと呼ばれる)がある
ホストシステムにアクセスします。/mnt/alias/storage/

(下記は必ずしも必要な情報ではない場合があります。)
私が言いたいのは、その中のすべてが美しい名前の人から/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'
名前 tar(sub) から先行する '/' を削除:
'/mnt/alias/backup/2014/06/13/shisha_10_25_.data.tar.gz': オープンできません: 対応するファイルまたはディレクトリなし
tar(sub): エラー回復不能:今すぐ終了
できませんでした! !

ご覧のとおり、echo次のCOMMAND3があります。

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

スクリプトを実行したのと同じユーザー(どちらの場合もルート)として、このコマンドを手動で実行すると機能します。ファイルを除いてディレクトリが存在するため、スクリプトが
存在しないファイルやディレクトリについて文句を言う理由は理解できません。 *.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」を拡張しようとしますが、目的の結果ではない可能性があります。変数を目立たせて選択しやすくするので、使用することは決して悪くありません。

おすすめ記事