이 bash 조각이 주어지면 :
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo $PARMS
rsync ${PARMS} . ${TARGET}
echo는 PARMS 문자열을 예상대로 표시하지만 오류는 표시되지 않지만 rsync는 + =로 추가 된 옵션이없는 것처럼 자동으로 작동합니다. 그러나 이것은 예상대로 작동합니다.
PARMS='-rvu'
rsync ${PARMS} --delete --exclude='.git' . ${TARGET}
나는 bash 따옴표 (항상 문제가 있음)로 무언가를 망쳐 놓았지만 문자열이 올바르게 작성된 것처럼 보이지만 옵션이 무엇과 왜 무시되는지 정확히 알지 못합니다.
답변
다음과 같은 차이점이 있습니다.
PARMS+="... --exclude='.git'"
과
... --exclude='.git'
첫 번째로 작은 따옴표는 따옴표 자체 안에 있으므로 문자 그대로rsync 인수로 지정된 대체 텍스트에 표시됩니다 . rsync값이 인 인수를 가져옵니다 --exclude='.git'. 두 번째에서 작은 따옴표는 그들이 있기 때문에, 그들이 작성하고있는 시점에서 쉘에 의해 해석 되지 않습니다 따옴표 안에 자신을, 그리고 rsync볼 얻는다 --exclude=.git.
이 경우 작은 따옴표가 필요하지 않습니다. .git특수 문자없이 자체적으로 완벽하게 유효한 셸 단어이므로 명령에 그대로 사용할 수 있습니다.
그러나 이런 종류의 것에 더 나은 것은 배열입니다 .
PARMS=(-rvu)
PARMS+=(--delete --exclude='.git')
rsync "${PARMS[@]}"
이것은 배열 줄을 쓸 때 해석하려는 인용 부호와 함께 명령을 별도의 단어로 작성합니다. 인수 자체에 특수 문자 나 공백이 있어도 배열의 각 항목을 별도의 인수로 "${PARMS[@]}"확장 하므로 rsync의도 한대로 작성한 내용을 봅니다.
답변
@Michael Homer의 답변 외에도 bash eval 함수를 사용할 수 있습니다 .
PARMS='-rvu'
PARMS+=" --delete --exclude='.git'"
echo "$PARMS"
eval "rsync ${PARMS} . "'"${TARGET}"'