示例bash脚本演示了我的问题:
#!/bin/bash
function exclude
{
BACKUP_EXCLUDES="$BACKUP_EXCLUDES --exclude=\"$1\""
}
exclude "/proc"
exclude "/dev"
exclude "/mnt"
exclude "/media"
exclude "/lost+found"
echo $BACKUP_EXCLUDES
输出:
- exclude =“/ proc”--exclude =“/ dev”--exclude =“/ mnt”--exclude =“/ media”--exclude =“/ lost + found”
完美!但是当我尝试添加时:
rsync -ruvz $BACKUP_EXCLUDES / /some/backup/path
$ BACKUP_EXCLUDES完全被忽略,没有错误或警告......为什么?
答案 0 :(得分:3)
你需要使用数组:
#!/usr/bin/env bash
BACKUP_EXCLUDES=()
function exclude
{
while
(( $# ))
do
BACKUP_EXCLUDES+=(--exclude="$1")
shift
done
}
exclude /proc /dev /mnt /media
exclude "/lost+found"
rsync -ruvz "${BACKUP_EXCLUDES[@]}" / /some/backup/path
bash解释:请检查@janos回答
zsh解释(如果它是Zsh):当你使用字符串变量时,就像你传递了--exclude="\"/proc\" --exclude=\"/media\" ..."
- 所以它被视为带有空格的长路径 - 从未匹配
答案 1 :(得分:3)
它不起作用,因为引号包含在各个--exclude
参数中。也就是说,rsync
将忽略"/proc"
而不是/proc
。当然"/proc"
(带引号)不存在。
如果你在命令前面贴上一个eval它会起作用,如下所示:
eval rsync -ruvz $BACKUP_EXCLUDES / /some/backup/path
在这种情况下,--exclude="/proc"
(和所有其他人)将被评估为--exclude=/proc
,这就是为什么它会起作用。
但我认为你应该使用@mpapis提出的数组,或者注释提出的--exclude-from=FILE
。两者都是更好,更清洁的解决方案。