스크립트의 tar가 수동으로 tar를 사용하는 것과 다르게 동작하는 이유는 무엇입니까?

스크립트의 tar가 수동으로 tar를 사용하는 것과 다르게 동작하는 이유는 무엇입니까?

이메일과 클라우드 서비스에 대한 백업 스크립트를 작성 중입니다.
단순화를 위해 여기에는 메일 백업 부분만 게시했습니다.

기본적으로 일부 Virtual Box가 실행되는 호스트 머신이 있습니다. 이러한 가상 상자는 vmail 폴더(내 경우에는 shishaMail이라고 함)가 있는
호스트 시스템에 액세스합니다./mnt/alias/storage/

(다음 내용은 꼭 필요한 정보가 아닐 수도 있습니다)
안에 있는 것들은 다 예쁜 이름을 가진 프롬 /mnt/alias/이라고 말하고 싶어요 . 이 랙 폴더에는 드라이브 마운트가 있습니다.ln -s/mnt/rack/*

(필요한 정보는 아님 END)

여기 내 스크립트가 있습니다

#!/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(하위): 오류 복구할 수 없습니다. 지금 종료합니다.
실패!!

보시다시피 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'를 확장하려고 시도하지만 아마도 원하는 것이 아닐 것입니다. 변수를 눈에 띄게 만들고 선택하기 쉽게 하므로 사용해도 결코 나쁠 것이 없습니다.

관련 정보