/ / Zapobiegaj rozszerzeniu `~` - bash, rozszerzenie zmiennej

Zapobiegaj ekspansji `~` - bash, variable-expansion

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 № 1
files=(~/.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