从shell脚本执行命令失败

时间:2015-08-26 22:52:42

标签: bash rsync

当我运行我的脚本时,它失败了:

# sh -x ./rsync.sh 
...
+ rsync --safe-links --password-file=/etc/rsync.secret -rtvun --include='*.log*.gz' --filter='-! */' --prune-empty-dirs /some/path foo@hostname::foo
Unknown filter rule: `'-!'
rsync error: syntax or usage error (code 1) at exclude.c(904) [client=3.1.1]

但是当我复制并粘贴rsync --safe-links ....行并执行它时,它可以正常工作。

rsync.sh:

#!/bin/bash

rsync_opts="--safe-links --password-file=/etc/rsync.secret -rtvu"

while read path hostname volume extra_opts; do
  rsync ${rsync_opts} ${extra_opts} ${path} ${volume}@${hostname}::${volume}
done < /etc/rsync.paths

rsync.paths:

/some/path/ hostname foo --include='*.log*.gz' --filter='-! */' --prune-empty-dirs

有没有人知道为什么它从脚本失败并且在我手动运行命令时工作正常?我该如何解决?

更新 当我使用eval "rsync ..."时,它工作正常,但我仍然不知道为什么它不适用于它:/

1 个答案:

答案 0 :(得分:0)

您的问题是您的脚本将文本--filter='-! */' --prune-empty-dirs读入变量$extra_opts,该变量将字面传递给命令,包括撇号。因此它分为以下参数:--filter='-!*/'--prune-empty-dirs。当你eval时,然后整行被传递给shell解释器,它以你想要的方式解释撇号,这就是它工作的原因。

此外,由于您的脚本使用bash,因此您应使用bash -x而不是sh -x对其进行调试。

相关问题