为什么脚本中的 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.gz文件之外的目录都存在,因为它必须由tar.

答案1

尝试从 COMMAND3 创建行中删除单引号:

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

当您手动执行该行时,shell 在 tar 看到参数之前删除引号。

您没有在文件名中插入空格,因此不需要引号。实际上,您可以进一步简化该行:

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

大括号用于分隔变量名称,否则它会尝试扩展“PIMPURLshisha”,可能不是您想要的。使用它们从来没有坏处,因为它也使变量脱颖而出,更容易挑选。

相关内容