如果在脚本内调用,Rsync 的行为会有所不同

如果在脚本内调用,Rsync 的行为会有所不同

因此,我正在编写备份脚本,并且想跳过 .iso 文件。

如果我从命令行使用命令,一切正常:

rsync -a --delete --exclude='*.iso' /home/user/Desktop/Work /mnt/profile/Desktop/

但是,当我尝试在脚本中使用它时,没有获得“排除”设置,并继续复制 .iso 文件。这是脚本:

#!/bin/bash
set -e

SRC_DIR="/home/user/Desktop/Work"
DST_MOUNTPOINT="/mnt/profile"
DST_DIR="/mnt/profile/Desktop/"
OPTIONS=" --exclude='*.iso' "

mountpoint -q $DST_MOUNTPOINT || mount $DST_MOUNTPOINT

rsync -a --delete $OPTIONS $SRC_DIR $DST_DIR

如果我运行脚本,获取其 PID 并检查 /proc/PID/cmdline,则排除设置就在那里。

我做错了什么?

答案1

您在排除模式上加上引号。

OPTIONS=" --exclude='*.iso' "
rsync $OPTIONS

这里,OPTIONS包含.由于命令行上没有引用它,因此会发生分词,删除末尾的空格。但字符串中的单引号仍然存在,并被传递给.该模式不匹配,因为文件名的开头和结尾不可能带有引号。<space>--exclude='*.iso'<space>rsyncrsync

删除多余的引号(和空格)并引用您的变量:

OPTIONS="--exclude=*.iso"
rsync "$OPTIONS" "$SRC_DIR" "$DST_DIR"

相关内容