防止`~`的扩展

时间:2014-11-18 10:24:48

标签: bash variable-expansion

我有一个脚本,可以将一些文件与远程主机同步。我想要发出的命令是

形式
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了解主目录是~的意思?

2 个答案:

答案 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