Mam skrypt, który synchronizuje kilka plików ze zdalnym hostem. Polecenia, które chcę wydać, mają postać
rsync -avz ~/.alias user@y:~/.alias
Mój skrypt wygląda tak:
files=(~/.alias ~/.vimrc)
for file in "${files[@]}"; do
rsync -avz "${file}" "user@server:${file}"
done
Ale ~
zawsze się rozszerza i faktycznie przywołuję polecenie
rsync -avz /home/user/.alias user@server:/home/user/.alias
zamiast tego powyżej. Ale ścieżka do katalogu domowego niekoniecznie jest taka sama lokalnie, jak na serwerze. Mogę użyć np. sed
aby zastąpić tę część, ale jest to bardzo żmudne, aby zrobić to dla kilku serwerów z różnymi ścieżkami. Czy istnieje sposób na wykorzystanie ~
bez jego rozszerzenia w czasie wykonywania skryptu, ale nadal rsync
rozumie, że katalog domowy ma na celu ~
?
Odpowiedzi:
2 dla odpowiedzi № 1files=(~/.alias ~/.vimrc)
Ścieżki są już rozwinięte w tym momencie. Jeśli tego nie chcesz, unikaj ich lub cytuj.
files=("~/.alias" ~/.vimrc)
Oczywiście, nie możesz ich używać, ponieważ uniemożliwiłeś powłoce rozwinięcie „~”:
~/.alias: No such file or directory
Możesz rozwinąć tyldę później przy użyciu polecenia eval
(zawsze staraj się unikać eval
jednak!) lub zwykłe zastąpienie:
for file in "${files[@]}"; do
rsync -avz "${file/#~/$HOME/}" "user@server:${file}"
done
1 dla odpowiedzi nr 2
Nie musisz zapętlać, możesz po prostu:
rsync -avz ~/.alias/* "user@y:~/.alias/"
EDYTOWAĆ: Możesz to zrobić:
files=(.alias .vimrc)
for file in "${files[@]}"; do
rsync -avz ~/"${file}" "user@server:~/""${file}"
done