概述

最近还在调整双系统互操作性。其中有个rsync同步数据的功能,本来是用vimscript写的,能正常使用,但是到shell下就不好用了,核心代码如下:

function MyRsync()
let param='--exclude "dir1"'
call system("rsync -r " . param . " /source /target")
endfunction

换到shell下我就改成了如下的代码:

param='--exclude "dir1"'
rsync -r ${param} /source /target

命令能执行,但是没有忽略dir1目录,而且即便把命令定义改成:

param="--exclude \"dir1\""

同样不好用。

后来我那个上搜了下,推荐的做法是用数组替代字符串:

param=( --exclude "dir1" )
rsync "${param[@]}" /source /target

这样单个选项的引号可以保留,[@]的作用是把数组转为字符串。不用字符串,文本着色也更直观了。

参考:StackExchange