2014-11-18 3 views
0

몇개의 파일을 원격 호스트와 동기화시키는 스크립트가 있습니다. 내가 발행 할 명령의 형식은`~`의 확장을 막으십시오

rsync -avz ~/.alias [email protected]:~/.alias 

내 스크립트는 다음과 같습니다

files=(~/.alias ~/.vimrc) 

for file in "${files[@]}"; do 
    rsync -avz "${file}" "[email protected]:${file}" 
done 

그러나 항상 ~ 확장됩니다 사실 내가 명령을 호출

rsync -avz /home/user/.alias [email protected]:/home/user/.alias 
위의 예 대신

하지만 홈 디렉토리 경로는 서버에있는 경로와 동일하지 않습니다. 예를 들어 사용할 수 있습니다. 이 부분을 대체하려면 sed이지만, 모든 경로가 다른 여러 서버에서이 작업을 수행하는 것은 지루합니다. 스크립트 실행 중에 확장되지 않고 ~을 사용할 수 있습니까? 그렇지만 rsync은 홈 디렉토리가 ~을 의미한다는 것을 알고 있습니까? 당신은 루프 필요가 없습니다

+1

탈출을하거나 원격 서버에 확장해야하기 때문에 작동하지 않습니다 당신의 경로 – BroSlow

+0

을 인용. – pfnuesel

+0

배열을 할당하면 확장됩니다. 배열 할당에서 인용 된 경로를 두 번째 배열로 만들고 인덱스 또는 무언가를 반복하십시오. 이해합니다. 확실하지 않은 경우 – BroSlow

답변

2
files=(~/.alias ~/.vimrc) 

이 지점에서. 너가 그것을 원하지 않으면, 그들을 피하거나 인용한다.

~/.alias: No such file or directory 

하려고 항상 (당신은 eval을 사용하여 명령 이후에 물결을 확장 할 수 있습니다 : 당신이 '~'확장에서 쉘을 방지하기 때문에

files=('~/.alias' \~/.vimrc) 

은 물론, 당신은 그들을 사용할 수 없습니다 !하지만 eval를 방지) 또는 간단한 대체합니다 :

for file in "${files[@]}"; do 
    rsync -avz "${file/#\~/$HOME/}" "[email protected]:${file}" 
done 
1

, 당신은 할 수 있습니다 :

rsync -avz ~/.alias/* '[email protected]:~/.alias/' 

편집 : 당신은 할 수 있습니다 : 경로가 이미 확장되어

files=(.alias .vimrc) 

for file in "${files[@]}"; do 
    rsync -avz ~/"${file}" '[email protected]:~/'"${file}" 
done 
+0

이것은 MWE입니다. 내 배열에 하나 이상의 파일이 있습니다. – pfnuesel

+0

'~/.alias/*'는 ~/.alias /'디렉토리의 모든 파일을 선택합니다. – anubhava

+0

'.alias'는 디렉토리가 아닙니다 ...; 나는 더 명확하게하기 위해 나의 질문에 배열을 변경했다. – pfnuesel