我有一个真正简单的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。
答案 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