가변 rsync 매개변수에 대해 질문이 있습니다. COMPILE_FILTERS 변수에 필터 표현식을 연결하고 있습니다. 예:
COMPILE_FILTERS='--filter="- js/editor/editorjs/*"'
rsync -a $COMPILE_FILTERS \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*" \
$src $dest
다음 응답이 표시됩니다.
Unknown filter rule: `"-'
rsync error: syntax or usage error (code 1) at exclude.c(927)
[client=3.1.3]
통역사가 하이픈을 차단하는 것 같기 때문에 이것은 이상합니다.
제안사항이 있으면 미리 감사 인사를 전해주세요.
답변1
코드에 두 가지 문제가 있습니다.
확장은
$COMPILE_FILTERS
인용되지 않았습니다. 이는 해당 값이--filter="- js/editor/editorjs/*"
공백의 단어로 분할됨을 의미합니다(기본적으로). 이 단어는--filter="-
및 입니다js/editor/editorjs/*"
. 이 단어는 파일 이름 생성(와일드카드)을 수행하지만 귀하의 경우 해당 패턴과 일치하는 파일이 있는 경우에만 문제가 됩니다js/editor/editorjs/*"
.두 단어로 나누면
rsync
다음을 얻을 수 있습니다.두 가지 인수, 그 중 첫 번째 항목을 올바르게 사용하지 못합니다(오류 메시지에서 참조하는 내용).당신이 해결이것큰따옴표를 통해 인용된 변수를 확장하면 문제가 해결됩니다.
변수에 저장한 문자열포함하다큰따옴표. 변수 확장을 큰따옴표로 묶는 경우 기본적으로
rsync
필터"- js/editor/editorjs/*"
(큰따옴표 및 모든 항목 포함)를 사용하라는 의미입니다. 이는 문자열 주위에 작은따옴표를 사용하고 있기 때문입니다.당신이 해결이것변수에 올바른 문자열을 할당하여 문제를 해결하십시오.
COMPILE_FILTERS=--filter="- js/editor/editorjs/*"
또는
COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
최종 결과:
COMPILE_FILTERS='--filter=- js/editor/editorjs/*'
rsync -a "$COMPILE_FILTERS" \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*" \
"$src" "$dest"
코드와 관련된 다른 변수도 참조하고 있습니다.
또한보십시오:
나중에 변수에 더 많은 필터를 포함하기로 결정한 경우 배열로 전환해야 합니다(이러한 필터를 지원하는 셸에서).
filters=(
--filter="- js/editor/editorjs/*"
--filter="- *node_modules*"
--filter="- .git*"
--filter="- /**/.git*"
)
rsync --archive "${filters[@]}" "$src" "$dest"
명명된 배열 변수( /bin/sh
, dash
)가 없는 셸에서는 less를 입력할 수 있습니다.
set -- \
--filter="- js/editor/editorjs/*" \
--filter="- *node_modules*" \
--filter="- .git*" \
--filter="- /**/.git*"
rsync --archive "$@" "$src" "$dest"
개별 필터 매개변수를 적절하게 처리하려면 배열이나 목록이 필요합니다. 여러 필터를 단일 문자열로 결합하는 것은 가능하지만 셸의 토큰화 및 파일 이름 글로빙을 적절하게 처리해야 하기 때문에 훨씬 더 어렵습니다.