从bash脚本运行时出现Rsync语法错误

时间:2014-02-26 02:07:43

标签: bash syntax rsync

我一直在研究使用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

3 个答案:

答案 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"