bash:rsync,选项为变量

时间:2013-10-07 08:07:08

标签: bash ssh rsync

我正在编写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? 提前感谢您提示。

2 个答案:

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