![Rsync는 스크립트에서 큰따옴표를 무시합니다.](https://rvso.com/image/1684445/Rsync%EB%8A%94%20%EC%8A%A4%ED%81%AC%EB%A6%BD%ED%8A%B8%EC%97%90%EC%84%9C%20%ED%81%B0%EB%94%B0%EC%98%B4%ED%91%9C%EB%A5%BC%20%EB%AC%B4%EC%8B%9C%ED%95%A9%EB%8B%88%EB%8B%A4..png)
변수가 "$exclude_list"
매개변수로 호출되면 rsync는 큰따옴표를 무시하고 스크립트에 언급되지 않은 홈 폴더도 포함합니다. 나는 그것을 로 마무리하려고 노력했지만 "${exclude_list}"
, 그것 역시 도움이 되지 않았습니다.
와 함께 사용하기 전에 변수의 내용을 표시하면 rsync
해당 내용이 올바른 것으로 표시됩니다.
또 다른 이상한 점은 출력 echo rsync ...
이 정확하고 오류가 없다는 것입니다.
문제가 있는 bash 스크립트의 일부:
echo "$exclude_list"
rsync -av --dry-run "$exclude_list" "$src" "$dest" >> /var/log/rsync.log || {
sendmail "Error: rsync failed for folder $src."; exit 1; }
산출:
--exclude=lost+found
rsync: [sender] link_stat "/home/user/ --exclude=lost+found" failed: No such file or
directory (2)
rsync error: some files/attrs were not transferred (see previous errors) (code 23) at
main.c(1333) [sender=3.2.3]
MCVE는 다음과 같습니다.
#!/bin/bash
# List of source folders
SRC_FOLDERS=(
[0]="/mnt/load-1/"
[1]="/mnt/load-2/"
)
# List of backup folders
DEST_FOLDERS=(
[0]="/mnt/load-1-b/"
[1]="/mnt/load-2-b/"
)
# List of folders to exclude during backup
EXCLUDE_FOLDERS=(
"lost+found"
"lost-found"
)
# Form the exclude list for rsync
for exclude_folder in "${EXCLUDE_FOLDERS[@]}"; do
exclude_list="$exclude_list --exclude=$exclude_folder"
done
# Loop through each folder pair
for i in "${!SRC_FOLDERS[@]}"; do
src=${SRC_FOLDERS[$i]}
dest=${DEST_FOLDERS[$i]}
rsync -av --dry-run "$exclude_list" "$src" "$dest"
done
답변1
문제는
for exclude_folder in "${EXCLUDE_FOLDERS[@]}"; do exclude_list="$exclude_list --exclude=$exclude_folder" done
배열을 반복하고 배열에서 EXCLUDE_FOLDERS
배열이 아닌 변수를 만듭니다 . exclude_list
나중에 로 지칭될 때 "$exclude_list"
쉘은 이를 단일 단어로 확장합니다.
for
루프 exclude_list
가 비어 있기 전에 . 루프 내부의 첫 번째 할당은 변수가 --exclude…
. 선행 공백에 유의하십시오. 이 공간 때문에 rsync
이 단어를 옵션으로 인식하지 못합니다. 그것은 그것을 다음과 같이 인식합니다.상대 경로. 현재 작업 디렉토리는 /home/user/
. 따라서 절대 경로는 입니다 /home/user/ --exclude=…
. 해당 파일이 존재하지 않으며 이것이 오류 상태입니다.
선행 공간이 없고 exclude_list
어떻게든 로 생성된 경우에도 --exclude=… --exclude=…
여전히 잘못된 것입니다. "$exclude_list"
항상 한 단어로 확장됩니다. 각각이 --exclude=…
에 대한 별도의 인수가 되기를 원합니다 rsync
.
인용하지 않는 것이 $exclude_list
효과가 있을 수도 있지만, 이는 좋지 않은 해결책입니다. 예를 들어EXCLUDE_FOLDERS
요소에 공백, 탭 또는 줄 바꿈(또는 글로빙을 트리거하는 와일드카드)이 포함되어 있으면 실패할 수 있습니다(또는 실패할 수 있음)..
읽어주세요변수에 저장된 명령을 어떻게 실행할 수 있나요?Bash에서는 배열을 사용하는 것이 가장 좋은 경우가 많습니다. exclude_list
배열을 만듭니다 .
for exclude_folder in "${EXCLUDE_FOLDERS[@]}"; do
exclude_list+=("--exclude=$exclude_folder")
done
rsync
그런 다음 use 를 호출합니다 "${exclude_list[@]}"
.