为什么 rsync 在 bash 中不工作?

why rsync not working in bash?

我有真正简单的 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 但由于这个原因我不能。

如有任何帮助,我们将不胜感激。

我的 OS 是 Debian 喘不过气来的。

您正在使用 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