2014-02-26 36 views
1

我一直在使用rsync进行增量备份的备份脚本。从bash脚本运行时出现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

为什么脚本的'bash -x'输出中'rsync'选项有单引号?你能否在你的问题中包含你用来调用'rsync'的简单语句? –

+3

通常是一个前导的'+'符号和单引号字符串是'set -x'显示所有var扩展和字符串引用的行的方式,其中所有'“...”'现在都被“煮沸”到' ” ...''(单引号字符串)。我认为你是对的,缺少某些东西,我猜想O.P.正在做类似'rOpts =“ - aXV - 删除...”; rsync“$ rOpts”'。因此错误msg'未知选项',祝大家好运。 – shellter

+0

如果@shellter是正确的,你的第一站应该是[BashFAQ#50:我想在一个变量把一个命令,但是复杂的情况下总是失败(http://mywiki.wooledge.org/BashFAQ/ 050) –

回答

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)来处理这个没有它们的用例。

+0

完美,谢谢! – KroniK907

1

此:

rsync "$OPT1 $SRC $TRG" 

通过集中在一起作为一个参数,rsync不知道如何处理所有的预期参数。

试试这个:

rsync ${OPT1} ${SRC} ${TRG} 
1

@chepner建议的方法在我的Mac OS X(10.9.4)上不起作用,但是eval做到了。

eval rsync "$OPT1 $SRC $TRG"