[英]execute command from shell script fails
当我运行脚本时,它将失败:
# 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 ..."
时,它可以正常工作,但是我仍然不知道为什么它不能与它一起工作:/
您的问题是您的脚本读取文本--filter='-! */' --prune-empty-dirs
--filter='-! */' --prune-empty-dirs
到变量$extra_opts
,该变量$extra_opts
字面意义传递给命令,包括撇号。 因此将其分为以下参数:-- --filter='-!
, */'
和--prune-empty-dirs
。 但是,当您进行eval
时,整行将传递给shell解释器,该解释器将以您想要的方式解释撇号,这就是它起作用的原因。
另外,由于脚本使用bash
,因此应使用bash -x
而不是sh -x
对其进行调试。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.