Rsync는 스크립트에서 큰따옴표를 무시합니다.

Rsync는 스크립트에서 큰따옴표를 무시합니다.

변수가 "$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[@]}".

관련 정보