Bash 스크립트 rsync 퍼즐 게임

Bash 스크립트 rsync 퍼즐 게임

우울하다. 아래 스크립트는 처음 두 대상에는 작동하지만 두 번째 대상에는 작동하지 않습니다.

#!bin/bash
...
backitup () {
Todaysdate=`date "+%Y-%m-%dT%H_%M_%S"`
Sourcedir=$1
Destination=$2
Username=$(echo $Sourcedir | cut -f1 -d'@')
if [ "$Username" = "root" ] ; then
    RSYNCPATH="rsync"
else
    RSYNCPATH="sudo rsync"
fi

cmd="sudo rsync -vazP --rsync-path='$RSYNCPATH' --log-file=/var/log/rsync.log $Sourcedir /BACKUPS/$Destination/back-$Todaysdate"
                echo $cmd >> ~/cmd.txt
                $cmd
...
}
backitup root@HAZns01:/etc "HAZNS01/etc"
backitup root@HAZns01:/home/ftpusers "HAZNS01/ftpusers"
backitup jakadmin@HAZFAND10:/etc "HAZFAND10/etc"
backitup jakadmin@HAZFAND11:/etc "HAZFAND11/etc"

후자의 두 호출은 다음을 제공합니다.

unexpected remote arg: jakadmin@HAZFAND10:/etc

그러나 명령줄(bash cmd.txt)에서 cmd.txt의 내용을 실행한 다음 수동으로 실행하면 정상적으로 실행됩니다. 어떻게 그럴 수 있습니까? (물론 비밀번호 없는 SSH가 올바르게 설정되어 있습니다)

내가 무엇을 놓치고 있나요?

답변1

보다배쉬 FAQ/050.

WordSplitting과 변수 내의 작은따옴표는 리터럴이므로 이 작업은 문법적으로 실패합니다.

쉘 스크립트를 작성할 때 변수에 명령을 넣지 마십시오.

함수를 사용하여 명령을 재사용하세요. 녹음 용 set -x. 또는 필요한 경우에만 배열을 사용하여 명령의 일부와 해당 인수를 보관할 수 있습니다.

그건 그렇고, 한 줄에서는 $()명령 대체를 사용합니다. 이것이 올바른 방법입니다. 다른 줄에서는 더 이상 사용되지 않는 백틱을 사용했습니다. 최소한 일관성을 유지하세요.

관련 정보