為什麼我的腳本中的 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”,可能不是您想要的。使用它們從來沒有壞處,因為它也使變數脫穎而出,更容易挑選。

相關內容