我有一个脚本,可以将一些文件与远程主机同步。我想要发出的命令是
形式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
而不是上面的那个。但是主目录的路径在本地不一定与服务器上的路径相同。我可以使用例如sed
替换此部分,但对于具有所有不同路径的多个服务器执行此操作非常繁琐。有没有办法使用~
而不在脚本运行期间展开它,但仍然rsync
了解主目录是~
的意思?
答案 0 :(得分: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
答案 1 :(得分:1)
你不需要循环,你可以这样做:
rsync -avz ~/.alias/* 'user@y:~/.alias/'
编辑:您可以这样做:
files=(.alias .vimrc)
for file in "${files[@]}"; do
rsync -avz ~/"${file}" 'user@server:~/'"${file}"
done