bash -vx
以下是我的备份脚本的输出片段
\+ rsync '' -avushi --stats --progress --log-file=/home/bigbird/temp/rlog/rlog1.txt /media/dataspace/data/webcasts/ /media/work/data/webcasts
发送增量文件列表
我一直都在做rsync
这样的事情,直到最近一两个月才发现这个问题。这个是在 Kubuntu Oneiric 上运行的,但我想我可能在 Kubuntu Lucid 上也见过它。
脚本正在运行/home/bigbird/bin
它运行完美,只是它额外将我当前目录中的所有文件传输到目标。我rsync
在脚本中还有一秒钟对另一个目录执行相同的操作。
我只是从另一个目录再次运行它,它复制了所有这些文件。
我在任何地方都没有看到"."
源代码等等。
我做了一个set | less
查看了我的所有~/bin
文件
查看了我所有的别名
我不知道是什么原因造成这种情况。
我应该去哪里寻找问题?
答案1
原始代码是
DRYRUN="-n"
DRYRUN=""
...
rsync "${DRYRUN}" -avushi --stats --progress --log-file="${LOGFILE}"
/media/dataspace/data/webcasts/ "${MOUNT}${DESTDIR}"
工作代码是
DRYRUN=1 ## for testing rsync without any file transfers
DRYRUN=0 ## for live run
...
if (( ${DRYRUN} ))
then
rsync -n -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
else
rsync -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
fi
“我们遇到了敌人,他就是我们自己!”——沃尔特·凯利(Pogo 漫画)
我找到了!看不见不代表它不存在。
我不太明白发生了什么,但是,通过在 rsync 命令行中输入“${DRYRUN}”,它使 rsync 的第一个参数变为“”。显然,它被解释为 PWD,而不是错误。因此,命令是将“”和我的真实源传输到我的真实目的地,因为 rsync 接受多个源。
剩下的问题是,为什么 rsync 认为“”表示当前目录,而不是将其解释为语法错误?
答案2
你的情况很简单,你只需删除变量周围的引号:
rsync $DRYRUN -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
但在另一种情况下,您可能需要引号,例如,如果参数是包含空格的路径,则可能定义也可能未定义。因此,这里有一个更优雅的解决方案:
linkdest="<OLD_BACKUP_PATH>"
rsync ${linkdest:+--linkdest="$linkdest"} -avushi --stats --progress --log-file="${LOGFILE2}" /media/dataspace"${DESTDIR2}"/ "${MOUNT}${DESTDIR2}"
如果 $linkdest 为空,没有什么将被插入。如果 $linkdest 不为空,则将插入 --linkdest="$linkdest"(并且它将被评估为命令而不是字符串)。