为什么rsync不能在bash中工作?

时间:2017-03-01 16:59:21

标签: bash rsync

我有一个真正简单的rsync bash文件,如下所示:

#!bin/bash
rsync -avh --exclude={"/media/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/lost+found/*"}  / /my/backup/path

但问题出在我做的时候:

sh mybash.sh

它忘记了我有一些不做的事情并且它备份了所有东西。最有趣的是我什么时候:

rsync -avh --exclude={"/media/*","/dev/*","/proc/*","/sys/*","/tmp/*","/run/*","/mnt/*","/lost+found/*"}  / /my/backup/path

在命令行中,它会考虑我的排除。

我需要将bash放在crontab中,但出于这个原因我不能。

任何帮助都将不胜感激。

我的操作系统是Debian wheezy。

1 个答案:

答案 0 :(得分:2)

您正在使用bash以外的其他内容执行脚本,可能是dash,但不会识别大括号扩展。明确:

bash mybash.sh

但是,bash中的大括号扩展主要是作为交互式使用的快捷方式。如果您正在编写脚本,请明确(您的文本编辑器应该简化):

#!/bin/sh
rsync -avh \
   --exclude "/media/*" \
   --exclude "/dev/*" \
   --exclude "/proc/*" \
   --exclude "/sys/*" \
   --exclude "/tmp/*" \
   --exclude "/run/*" \
   --exclude "/mnt/*" \
   --exclude "/lost+found/*" \
   / /my/backup/path

现在您不必担心哪个shell执行脚本,只要它符合POSIX标准。

如果您真的想使用bash功能,我建议使用数组而不是大括号扩展。它将来更易读,更容易编辑。

#!/bin/bash
exclusions=(
   --exclude "/media/*"
   --exclude "/dev/*"
   --exclude "/proc/*"
   --exclude "/sys/*"
   --exclude "/tmp/*"
   --exclude "/run/*"
   --exclude "/mnt/*"
   --exclude "/lost+found/*"
)
rsync -avh "${exclusions[@]}" / /my/backup/path