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

Del*_*lta 2 scripting bash shell-script

所以,我正在编写一个备份脚本,并想跳过 .iso 文件。

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

rsync -a --delete --exclude='*.iso' /home/user/Desktop/Work /mnt/profile/Desktop/
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试在我的脚本中使用它时,没有获得“排除”设置,并继续复制 .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
Run Code Online (Sandbox Code Playgroud)

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

我做错了什么?

ilk*_*chu 5

您在排除模式上加引号。

OPTIONS=" --exclude='*.iso' "
rsync $OPTIONS
Run Code Online (Sandbox Code Playgroud)

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

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

OPTIONS="--exclude=*.iso"
rsync "$OPTIONS" "$SRC_DIR" "$DST_DIR"
Run Code Online (Sandbox Code Playgroud)