0

我有一个脚本,它与远程主机同步一些文件。我要发出的命令的形式是

rsync -avz ~/.alias user@y:~/.alias

我的脚本如下所示:

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

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

但是~总是被扩展,事实上我调用了命令

rsync -avz /home/user/.alias user@server:/home/user/.alias

而不是上面那个。但是主目录的路径在本地不一定与服务器上的相同。我可以使用 egsed来替换这部分,但是对于具有所有不同路径的多个服务器执行此操作非常繁琐。有没有一种方法可以~在脚本运行时不扩展它的情况下使用,但仍然rsync理解主目录的含义~

4

2 回答 2

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

此时路径已经扩展。如果您不希望这样,请转义它们或引用它们。

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

当然,你不能使用它们,因为你阻止了 shell 扩展'~':

~/.alias: No such file or directory

您可以稍后在命令中使用eval(始终尽量避免eval!)或简单的替换来扩展波浪号:

for file in "${files[@]}"; do
    rsync -avz "${file/#\~/$HOME/}" "user@server:${file}"
done
于 2014-11-18T10:39:21.573 回答
1

你不需要循环,你可以这样做:

rsync -avz ~/.alias/* 'user@y:~/.alias/'

编辑:你可以这样做:

files=(.alias .vimrc)

for file in "${files[@]}"; do
    rsync -avz ~/"${file}" 'user@server:~/'"${file}"
done
于 2014-11-18T10:30:22.553 回答