답변:
짧은 대답 : BashFAQ # 50을 참조하십시오 ( "명령을 변수에 넣으려고하지만 복잡한 경우는 항상 실패합니다!").
긴 대답 : 명령 (또는 명령의 일부)을 변수에 넣은 다음 원래대로 되 돌리는 것은 복잡합니다. 쉘이 명령 행에서 변수를 확장 할 때 변수가 큰 따옴표 안에 있으면 구문 분석되지 않습니다. 따옴표로 묶지 않은 경우 공백이 인수 구분으로 구문 분석되지만 따옴표 및 이스케이프는 구문 분석되지 않습니다. 두 경우 모두 변수 값에 따옴표를 넣으면 아무 효과가 없습니다.
일반적으로 이런 종류의 작업을 수행하는 가장 좋은 방법은 간단한 텍스트 변수 대신 배열을 사용하는 것입니다.
FLAGS=(--archive --exclude="foo bar.txt")
rsync "${FLAGS[@]}" dir1 dir2
eval 은 다른 옵션입니다.
$ x="'a b'"
$ printf '%s,%s' $x
'a,b'
$ eval printf '%s,%s' $x
a b
또한보십시오:
문제가 보이지 않습니다.
$ FLAGS='--archive --exclude="foo bar.txt"'
$ echo $FLAGS
--archive --exclude="foo bar.txt"
어쩌면 값을 다시 인용해야 할 수도 있습니다.
$ rsync "$FLAGS" dir1 dir2
echo
당신이 생각하는 것을 보여주지 않습니다. 시도 printargs() { printf "'%s' " "$@"; echo; }; printargs $FLAGS; printargs "$FLAGS"
왜 둘 다 이러한 옵션 작업 볼 수 있습니다.