스크립트의 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' /mnt/alias/storage/shishaMail
tar:from member 이름 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"를 확장하려고 시도하지만 원하는 결과가 아닐 수 있습니다. 변수를 눈에 띄게 만들고 선택하기 쉽게 만들기 때문에 사용하는 것이 결코 나쁠 수 없습니다.

관련 정보