rsync를 사용하고 특정 설정에 따라 파일을 제외하는 스크립트를 작성 중입니다. 형식의 제외 플래그로 끝납니다 --exclude={foo, bar, baz}
.
그러나 명령에서 이를 확장하려고 할 때 rsync
플래그가 이스케이프된 것을 발견했습니다. Bash 디버거에서 rsync $excludes
Comes 명령이 rsync '--exclude={foo,bar,baz}'
예상대로 작동하지 않는 것을 볼 수 있습니다 . 일부 테스트를 통해 확장 시 , , 또는 rsync --exclude={foo,bar,baz}
포함된 문자열이 작은따옴표로 묶인다는 것을 발견했습니다. 생성된 문자열에 대해 eval을 사용하지 않고 이 문제를 해결할 수 있는 방법이 있습니까?=
{
}
답변1
인용할 때 중괄호 확장이 발생하지 않습니다. 또한 (가능한 경우) 변수가 아닌 배열에 매개변수를 저장해야 합니다.
나는 다음이 당신에게 도움이 될 것이라고 생각합니다.
excludes=( $(--exclude={foo,bar,baz}) )
rsync "${excludes[@]}"
답변2
Bash 디버거에서... =, { 또는 }를 포함하는 모든 문자열은 확장 시 작은따옴표로 묶입니다.
xtrace
출력( ) 을 참조하는 경우 set -x
특수 문자가 포함된 인수를 작은따옴표로 묶어 표시하는 것을 좋아합니다. 출력은 셸에 대한 입력으로 사용할 수 있는 형식입니다.
그러나 이것이 따옴표가 문자열의 일부라는 의미는 아닙니다.
비교하다:
$ echo abc def\ ghi
+ echo abc 'def ghi'
abc def ghi
$ echo abc \'def\ ghi\'
+ echo abc ''\''def ghi'\'''
abc 'def ghi'
내가 알 수 있는 한, 등호가 포함된 문자열을 인용하는 데는 문제가 되지 않습니다.