
rsync와 함께 작동하도록 명령 인수 변수를 가져오는 데 정말 어려움을 겪고 있습니다. 내가 보고 있는 동작은 스크립트의 오류입니다.
rsync: connection unexpectedly closed (0 bytes received so far) [sender]
rsync error: unexplained error (code 255) at io.c(601) [sender=3.0.7]
그러나 스크립트는 에코를 통해 실행할 명령을 출력하고 정확히 동일한 명령 복사본을 터미널에 붙여넣거나 (또는 그 뒤에 종료가 있는 첫 번째 줄로 스크립트에 다시) 잘 작동합니다.
이 rsync를 수행하는 스크립트 코드(이 경우 check_flags는 비어 있음):
rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- \"${backup_dir}\" \"admin@nas-1:${backup_basename}/\")
echo "CMD to run: rsync ${rsync_cmd[@]}"
rsync ${rsync_cmd[@]}
산출:
CMD to run: rsync -rWltpgoDvdHP --delete-before -- "/share/CACHEDEV1_DATA/veeam_backup_daily/Daily backup _@1am__1" "admin@nas-1:/share/CACHEDEV1_DATA/veeam_backup_daily/"
배열을 사용하면 이 문제에 도움이 된다는 내용을 온라인에서 읽었지만 이 경우에는 그렇지 않았습니다. 나는 이것이 쉬운 해결책이라고 확신하지만 그것은 나를 미치게 만듭니다!
답변1
쉘은 변수를 대체하기 전에 따옴표를 구문 분석하므로 변수 값에 따옴표를 포함하면 예상한 대로 작동하지 않습니다(그리고 는 echo
이러한 구별을 표시하지 않기 때문에 매우 오해의 소지가 있습니다). 당신이 해야 할 일은 배열을 정의할 때 이스케이프되지 않은 따옴표를 사용하는 것입니다(그래서 배열 값의 일부가 아닌 배열 요소 주위의 구분 기호로 구문 분석됩니다). 그런 다음 배열에 대한 참조를 큰 따옴표로 묶습니다(그래서 단어- 배열의 값을 분할하거나 와일드카드로 확장합니다. 또한 앞으로 일어날 일을 더 정확하게 보여주는 echo
명령으로 대체하겠습니다 .printf
rsync_cmd=(${check_flags} -rWltpgoDvdHP --delete-before -- "${backup_dir}" "admin@nas-1:${backup_basename}/")
printf "%q " CMD to run: rsync "${rsync_cmd[@]}"
printf "\n"
rsync "${rsync_cmd[@]}"
printf
예상한 내용이 표시되지 않을 수도 있습니다 .동등한실행될 명령을 표현하지만 각 인수에 대해 동등한 표현이 많이 있으며 원래 입력된 방식이 아닌 기본 설정에 따라 하나를 선택합니다. 그런데, 이와 같은 것을 디버깅하는 데에도 사용할 수 있지만 set -x
( 와 마찬가지로 printf "%q "
) 예상한 것과 다른 표현을 사용할 수도 있습니다.