6

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

4

2 回答 2

14

使用数组;这就是为什么它们被添加到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

于 2013-10-07T12:46:35.733 回答
4

使用eval. 尝试:

eval rsync $options user@server:$directory $backupDirectory
于 2013-10-07T08:20:09.053 回答