2009-05-11 6 views
7

나는 그렇게 보이는 간단한 테스트 bash는 스크립트가 :명령 줄 대 스크립트 파일 : rsync를하고 --exclude

#!/bin/bash 

cmd="rsync -rv --exclude '*~' ./dir ./new" 
$cmd # execute command 

나는 또한 ~로 끝나는 파일을 복사합니다 스크립트를 실행하면 비록 내가 그들을 제외시키는 것을 의미 했어도. 명령 줄에서 바로 똑같은 rsync 명령을 실행하면 작동합니다! 누군가가 bash 스크립트를 작동시키는 이유와 방법을 알고 있습니까?

Btw도 내가 --exclude-from과 함께 작업 할 수 있음을 알고 있지만 어쨌든 이것이 어떻게 작동하는지 알고 싶습니다.

답변

5

평가보십시오 :

#!/bin/bash 

cmd="rsync -rv --exclude '*~' ./dir ./new" 
eval $cmd # execute command 
0

당신은 (man 페이지에 accoding의)와 같은 간단한 --eclude '~' 사용할 수 있습니다 패턴 파일/다음은 의 특정 장소에 고정되어있는 계층 구조로 시작하면, 그렇지 않으면

  • 을 그것 은 경로 이름의 끝과 일치합니다. 이는 정규 표현식의 선두 인 ^과 유사합니다. 따라서 "/ foo" 은 " 글로벌 규칙의 경우" 또는 병합 파일의 디렉터리 (디렉터리 단위 규칙의 경우) 인 "foo"와 일치합니다. 알고리즘이 위에서 아래로 반복적으로 적용되므로 정규화되지 않은 "foo"는 이라는 이름의 "foo"와 일치합니다 (트리 ). 은 각 경로 구성 요소가 이되어 파일 이름의 끝에 오는 것처럼 작동합니다. unchchored "sub/foo"는 의 모든 지점에서 "foo"가 발견 된 계층 인 "sub"디렉토리 내의 과 일치합니다. 전송의 루트에 일치하는 패턴 을 지정하는 방법에 대한 설명은 INCLUDE/EXCLUDE PATTERNS 섹션에서 전체 논의를 참조하십시오.
  • 패턴이 /로 끝나면 정규 파일, 심볼릭 링크 또는 장치가 아닌 디렉토리와 만 일치합니다. 패턴 이 세 와일드 카드 문자 중 하나가 포함 된 경우
  • rsync와는 확인하여 단순한 문자열 일치와 와일드 카드 매칭을하고있는 사이에 선택 : '?' '*'및 '['.
  • '*'는 경로 구성 요소와 일치하지만 슬래시로 중지됩니다.
  • 슬래시를 포함하여 '**'를 사용하여 일치하는 항목을 찾습니다.
4

을 문제는 당신이 스크립트를 실행하고 있지이다, 당신이 변수에 명령을 넣고 확장 변수를 실행하는 것이이다 . 그리고 따옴표 제거가 이미 수행 된 후에 변수 확장이 발생하기 때문에 exclude 패턴을 둘러싼 작은 따옴표가 제거되지 않습니다 ... 따라서 rsync는 이름이 '~로 끝나는'파일은 제외합니다.단지 (모든 일이 큰 따옴표로 이미, 그래서 그들은이 필요하지 않습니다) 패턴 주위에 따옴표를 제거,이 문제를 해결하려면 다음

#!/bin/bash 

cmd="rsync -rv --exclude *~ ./dir ./new" 
$cmd # execute command 

... 말하자면, 왜 명령을 가하고의 변수를 실행하기 전에? 일반적으로 이것은 코드가 필요한 것보다 더 혼란스럽게 만들고, 이상한 구문 분석 (이보다 더 이상한 것)을 유발하는 좋은 방법입니다. 그럼 어때요 :

#!/bin/bash 

rsync -rv --exclude '*~' ./dir ./new 
+0

디버깅 할 변수에 넣습니다. 나는 따옴표를 사용하지 않고 시작했는데, 그것은 확장으로 인해 더 악화되었다. 예 : "rsync -r --exclude * ~ .dir ./new"를 "rsync -r --exclude foo ~ bar ~ foobar.sh ~ ./dir ./new"로 확장했습니다. – Chris

+0

작은 따옴표로 시도 했습니까? (두 번째 권장 사항 에서처럼) 변수에 넣지 않고? 그것은 잘 작동합니다 (그리고 내가 그것을 테스트했을 때) 보였다. –