rsync를 사용하여 서버에 스냅샷을 백업하기 위한 bash 스크립트를 작성하려고 합니다.
내가 부르고 싶은 명령은
rsync -aPh -e ssh --rsync-path='sudo rsync' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx
내 스크립트는 다음과 같습니다
OPT="-aPh -e ssh --rsync-path='sudo rsync'"
LINK="--link-dest=../last/"
SRC="/home/username/files/"
SNAP="remoteuser@server:/srv/backups/snapshots/username/"
date=`date "+%Y-%b-%d_%T"`
# Run rsync to create snapshot
rsync $OPT $LINK $SRC ${SNAP}$date
bash -x를 사용하여 이 스크립트를 실행하면 내가 받는 명령은 다음과 같습니다.
rsync -aPh -e ssh '--rsync-path='\''sudo' 'rsync'\''' --link-dest=../last /home/username/files remoteuser@server:/srv/backups/snapshots/username/snapshot_xxx
이로 인해 다음 오류가 발생합니다.
bash: -c: line 0: 일치하는 '''을(를) 찾는 동안 예상치 못한 EOF가 발생했습니다.
bash: -c: 행 1: 구문 오류: 예기치 않은 파일 끝
bash가 추가 작은따옴표와 이스케이프된 작은따옴표를 삽입하는 것을 방지하는 방법은 무엇입니까?
답변1
Bash는 추가 따옴표를 삽입하지 않지만 여기에서 수행합니다.
OPT="-aPh -e ssh --rsync-path='sudo rsync'"
^ ^
할당은 OPT
string 으로 설정됩니다 -aPh -e ssh --rsync-path='sudo rsync'
. 명령줄에서 확장되면 공백에서 , 및 rsync
5개의 서로 다른 인수로 분할됩니다.aPh
-e
ssh
--rsync-path='sudo
rsync'
'\''
출력에 표시되는 것은 bash -x
따옴표가 포함된 매개변수를 나타냅니다. 읽기가 약간 어렵지만 'foo'\''bar'
작은따옴표와 같습니다 "foo'bar"
(중간에 이스케이프된 작은따옴표가 있는 두 개의 작은따옴표 문자열이 있습니다).
변수 확장 후에는 따옴표가 작동하지 않습니다. 단순 변수에 공백이 포함된 인수가 포함된 명령을 저장할 수 없으며 대신 배열을 사용해야 합니다.
바라보다: