이것을 고려하면:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
echo는 예상대로 PARMS 문자열을 표시하고 오류를 표시하지 않지만 rsync는 += 추가 옵션이 존재하지 않는 것처럼 자동으로 실행됩니다. 그러나 이는 예상대로 작동합니다.
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
나는 bash 따옴표로 뭔가를 엉망으로 만들고 있다고 생각하지만 (항상 문제가 있음) 문자열이 올바르게 작성된 것처럼 보이지만 옵션이 무엇과 왜 무시되고 있는지 잘 모르겠습니다.
답변1
둘 사이에는 다음과 같은 차이점이 있습니다.
PARMS+="... --exclude='.git'"
그리고
... --exclude='.git'
첫 번째에서는 작은 따옴표 자체가 내부 따옴표입니다.그래서 그들은 존재합니다rsync
인수로 제공된 대체 텍스트에서. rsync
값이 있는 매개변수를 가져옵니다 --exclude='.git'
. 두 번째에서 작은따옴표는 작성할 때 쉘에 의해 해석됩니다.아니요내부 따옴표 자체를 rsync
볼 수 있습니다 --exclude=.git
.
이 경우에는 작은따옴표가 전혀 필요하지 않습니다. .git
특수 문자 없이 그 자체로 완벽하게 유효한 쉘 단어이므로 명령에서 문자 그대로 사용할 수 있습니다.
하지만 이런 종류의 일에는 더 좋습니다.대량으로:
PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"
이렇게 하면 명령이 별도의 단어로 구성되고 배열 행을 작성할 때 해석하려는 참조가 무엇이든 사용됩니다."${PARMS[@]}"
확장하다인수 자체에 특수 문자나 공백이 포함되어 있더라도 배열의 각 항목을 별도의 인수로 취급하므로 rsync
의도한 대로 작성했는지 확인하세요.
답변2
또한@마이클 호머의 답변, 당신은 그것을 사용할 수 있습니다bash
평가 기능:
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'