Linux rsync的脚本应该带有引号

Linux rsync的脚本应该带有引号,linux,bash,tcl,expect,rsync,Linux,Bash,Tcl,Expect,Rsync,我想将文件夹重新同步到另一台计算机。sshpass不是一个选项,证书也不是。所以我一直在期待 到目前为止,我已经有了这个bash脚本(最小化) 不知何故,-e选项周围的引号消失了,但exclude仍然保留着它们 所以我逃避引用 expect <<EOF set timeout -1 spawn rsync -e \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" \ -

我想将文件夹重新同步到另一台计算机。sshpass不是一个选项,证书也不是。所以我一直在期待

到目前为止,我已经有了这个bash脚本(最小化)

不知何故,-e选项周围的引号消失了,但exclude仍然保留着它们

所以我逃避引用

expect <<EOF
    set timeout -1
    spawn rsync -e \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" \
        -aHv --exclude=".*/" --delete ../.. ${USER}@${IP}:~/destination
    expect "password: "
    send "${PASSWORD}\n"
    expect eof
EOF
请注意,当直接在终端中键入命令时,该命令本身工作正常

我也尝试过不同的方法,比如“EOF”heredoc和通过环境传递变量,但总是得到不同种类的错误消息:-)

如何转义rsync命令以使其正常工作?

Tcl的语法(因此Expect的语法)与shell的语法不同。特别是引用规则不同,;你不需要在单词中间加双引号,因为TCL不会为你扩展GLUB字符(如果你想要的话,你需要显式地调用<代码> GOLB。这意味着您的
spawn
命令实际上最好编写为:

spawn rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
    -aHv --exclude=.*/ --delete ../.. ${USER}@${IP}:~/destination
#                ☝☝☝☝☝☝ LOOK HERE!

如果你想的话,你可以省略注释…即使在一行上也不起作用。
expect <<EOF
    set timeout -1
    spawn rsync -e \"ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null\" \
        -aHv --exclude=".*/" --delete ../.. ${USER}@${IP}:~/destination
    expect "password: "
    send "${PASSWORD}\n"
    expect eof
EOF
Missing trailing-" in remote-shell command.
spawn rsync -e "ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null" \
    -aHv --exclude=.*/ --delete ../.. ${USER}@${IP}:~/destination
#                ☝☝☝☝☝☝ LOOK HERE!