我一直在研究使用rsync进行增量备份的备份脚本。
我已手动测试了以下rsync命令,它运行并完成备份而没有错误:
rsync -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/
然而,当我在备份脚本中运行相同的命令时,它会给我以下错误:
rsync: -aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/: unknown option
rsync error: syntax or usage error (code 1) at main.c(1422) [client=3.0.6]
我在我的脚本上运行bash -x以确切地知道发送到控制台的内容,这是打印的内容:
+ rsync '-aAXv --delete --progress --link-dest=/backup/Uyuk/Uyuk-backup-part1/2014-02-24/ /mnt/backup/ /backup/Uyuk/Uyuk-backup-part1/2014-02-25/'
有谁看到有什么问题?我找不到任何会导致语法错误的内容。
编辑: 这是我在脚本中的实际代码,这是一个非常大的脚本,所以是的,这里没有定义一些变量,但是你明白了。
mkdir -p "/backup/$HOST/$NAME/$TODAY"
#source directory
SRC="$MNT"
#link directory
LNK="/backup/$HOST/$NAME/$LAST/"
#target directory
TRG="/backup/$HOST/$NAME/$TODAY/"
#rsync options
OPT1="-aAXv --delete --progress --link-dest=$LNK"
#run the rsync command
echo "rsync $OPT1 $SRC $TRG"
rsync "$OPT1 $SRC $TRG" > /var/log/backup/backup.rsync.log 2>&1
答案 0 :(得分:5)
当您需要将选项列表作为列表参数传递时,您将选项列表作为单个参数传递。通常,您应该使用bash
中的数组来保存您的参数,以防它们中的任何一个包含空格。请尝试以下方法:
mkdir -p "/backup/$HOST/$NAME/$TODAY"
#source directory
SRC="$MNT"
#link directory
LNK="/backup/$HOST/$NAME/$LAST/"
#target directory
TRG="/backup/$HOST/$NAME/$TODAY/"
#rsync options
OPTS=( "-aAXv" "--delete" "--progress" "--link-dest=$LNK" )
#run the rsync command
echo "rsync $OPT1 $SRC $TRG"
rsync "${OPTS[@]}" "$SRC" "$TRG" > /var/log/backup/backup.rsync.log 2>&1
引用时,数组扩展${OPTS[@]}
被特别视为一系列参数,每个参数都被单独引用以保留各个元素中的任何空格或特殊字符。如果arr=("a b" c d)
,则echo "${arr[@]}"
与
echo "a b" "c" "d"
而不是
echo "a b c d"
这在不支持数组的shell中不起作用,但是后来发明了数组,因为没有安全的方法(也就是说,没有使用eval
)来处理这个没有它们的用例
答案 1 :(得分:1)
此:
rsync "$OPT1 $SRC $TRG"
将所有预期的参数作为一个参数集中在一起,rsync
不知道如何处理。
请改为尝试:
rsync ${OPT1} ${SRC} ${TRG}
答案 2 :(得分:1)
@chepner建议的方法不能在我的Mac OS X(10.9.4)上运行,但eval
没有。
eval rsync "$OPT1 $SRC $TRG"