2017-04-25 9 views
0

따옴표와 관련된 안내 및 답변을 알고 있습니다. 나는 그들 (하루 종일)을 읽었지 만 나는 여전히 간단한 스크립트를 얻을 수 없다.변수에서 rsync 명령 실행 - 따옴표 사용하지 않음

script1.sh를 설정하고 명령을 실행 해 봅니다. 명령은 변수에 읽혀 져야하므로 에코를 수행하고 실행하고 나중에 다른 작업을 수행 할 수 있습니다.

내 명령은 내가 떠들썩한 파티에서 실행할 경우 예상대로 작동

rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 

이고 난 내 스크립트에 넣어합니다.

사이에 변수를 넣으면 --excludes가 더 이상 작동하지 않습니다.

job='rsync -vtirn -e ssh --exclude '"'"'._*'"'"' --exclude '"'"'[email protected]*'"'"' --exclude '"'"'.DS_Store'"'"' --progress /Path/ [email protected]:/Path 
echo $job 
$job 

이상한 점은 에코가 내가 필요한 명령을 정확히 보여줍니다. 에코 출력을 복사하여 쉘에 붙여 넣으면 명령이 올바르게 작동합니다. 그러나 $ job으로 시작된 명령은 제외 목록을 무시하는 것입니다.

큰 따옴표 만 사용하여 작은 따옴표 (/ ')를 이스케이프하여 처음과 끝에서 큰 따옴표로 시도했습니다 ... 너무 많은 옵션이 있지만 내'--exclude '필터'인수는 고려하지 않았습니다. 작동 한 유일한 것은

job=$(rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path) 

입니다. 그러나이 명령은 변수가 설정되는 즉시 시작됩니다 어떤 도움

+1

자세한 내용은 [BashFAQ # 50] (http://mywiki.wooledge.org/BashFAQ/050)에서 설명합니다. –

답변

3

에 미리

덕분에 명령 이름을 저장하는 일반 변수를 사용하지 마십시오. 함수를 정의하십시오. 당신이 정말로 로깅 및 실행을위한 하나의 양식을해야하는 경우

job() { 
    rsync -vtirn -e ssh --exclude '._*' --exclude '[email protected]*' --exclude '.DS_Store' --progress /Path/ [email protected]:/Path 
} 

rsync에 인수를 저장하는 배열을 정의합니다.

opts=(-vtrin 
     -e ssh 
     --exclude '._*' 
     --exclude '[email protected]*' 
     --exclude .DS_Store 
     --progress 
     /Path/ 
     [email protected]:/Path 
) 
echo "rsync ${opts[*]}" 
rsync "${opts[@]}" 

로그는 정확히 당신은 실행 명령과 동일하지 않습니다, 그러나 그것은 일 필요는 없습니다; 로그 메시지를 eval으로 전달하지 않습니다.

+0

나는'printf '% q' "$ {opts [@]}"를 고려할 것이다. 실제로 명령을 실행하는 것과 같은 효과로 복사하여 붙여 넣을 수있는 로깅을 제공합니다. 그대로, 'echo'의 출력은 오해의 소지가 있습니다. –

+0

(작업) 예를 들어 주셔서 감사합니다. 여기에서 가져 가려고합니다. 필자는'echo "rsync $ {opts [*]}",'echo "rsync $ {opts [@]}"'와'printf '% q'사이의 차이점을 알아 내려고 노력했다. "$ {opts [ ]} "; 에코 '. 나는이 스크립트를 모두 내 스크립트에 추가했다. 모든 스크립트는 동일하게 인쇄된다. (마지막 하나는 rsync를 제외하고) –