1

演示我的问题的示例 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 被完全忽略,没有错误或警告......为什么?

4

2 回答 2

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\" ..."- 所以它被视为带有空格的长路径 - 从来没有匹配过。

于 2013-07-13T04:27:47.947 回答
3

它不起作用,因为引号包含在各个--exclude参数中。也就是说,rsync将忽略"/proc"而不是/proc. 当然"/proc"(带引号)不存在。

如果您在命令前面加上一个 eval ,它将起作用,如下所示:

eval rsync -ruvz $BACKUP_EXCLUDES / /some/backup/path

在这种情况下,--exclude="/proc"(和所有其他人)将被评估为--exclude=/proc,这就是它会起作用的原因。

但我认为你应该使用@mpapis 建议的数组,或者--exclude-from=FILE评论建议的数组。两者都是更好和更清洁的解决方案。

于 2013-07-13T06:05:33.967 回答