我正在编写bash脚本,它在某些部分将通过ssh发送rsync文件。不幸的是,我遇到了将rsync选项保持为变量的问题。请看下面的内容:
# variables
directory="/etc"
backupDirectory="/backup"
incrementalBackup="/incremental"
options="-a -e 'ssh -p 10022' -b --backup-dir=$incrementalBackup --delete"
# rsync
rsync $options user@server:$directory $backupDirectory
不幸的是,上面的脚本因rsync错误而失败:
Unexpected remote arg: user@server:/etc
rsync error: syntax or usage error (code 1) at main.c(1201) [sender=3.0.6]
我在脚本调试过程中看到的是,ssh选项('ssh -p 10022')被视为rsync选项。 问题是如何正确地将这些额外的ssh设置传递给rsync? 提前感谢您提示。
答案 0 :(得分:10)
使用数组;这就是为什么他们被添加到bash
:
# variables
directory="/etc"
backupDirectory="/backup"
incrementalBackup="/incremental"
options=(-a -e 'ssh -p 10022' -b --backup-dir="$incrementalBackup" --delete)
# rsync
rsync "${options[@]}" user@server:"$directory" "$backupDirectory"
eval
不是一个安全的选择;它不仅限于评估您打算使用的引用,还会评估任何代码。它可能适用于您当前的情况,但options
值的更改可能会带来无法预料的后果,并且在没有必要时养成使用eval
的习惯通常是个坏主意。< / p>
答案 1 :(得分:4)
使用eval
。尝试:
eval rsync $options user@server:$directory $backupDirectory