在bash脚本中引用rsync的排除问题

用户1751825

我正在使用bash脚本通过rsync同步Web文件夹。我正在使用一系列要排除的文件夹和文件,但在将这些项目转义为排除列表时遇到问题...

我的排除列表的定义如下:

SYNC_EXCLUSIONS=(
    '/exclude_folder_1'
    '/exclude_folder_2'
    '.git*'
    '.svn'
)

然后我像这样构建排除字符串...

exclusions='';
for e in "${SYNC_EXCLUSIONS[@]}"
do
    exclusions+=" --exclude='$e'";
done

然后最后我执行我的rsync ...

rsync --recursive --delete $exclusions "$DEPLOYMENT_WORK_DIR/" "$DEPLOYMENT_ROOT/"

如果我回显该命令,则它看起来很完美;如果我在提示符下复制并执行了该命令,则它可以正常工作。但是,从脚本运行时,排除项将被忽略。

我已经弄清楚了,如果我从每个排除的项目中删除单引号,它将是可行的,就像这样...

exclusions+=" --exclude=$e";

不过,我最好不要这样做,以防万一我需要排除带有空格或特殊字符的文件夹。

有什么办法可以让我在脚本中使用它,同时保留被排除项目周围的引号?我尝试了引号和反斜杠等的各种组合,但没有尝试过。

查尔斯·达菲

您根本无法为此构建字符串-有关原因的广泛讨论,请参见BashFAQ#50建立一个数组。

exclusions=( )
for e in "${SYNC_EXCLUSIONS[@]}"; do
    exclusions+=( --exclude="$e" )
done

rsync --recursive --delete "${exclusions[@]}" "$DEPLOYMENT_WORK_DIR/" "$DEPLOYMENT_ROOT/"

...好吧,除非您要使用来执行它eval否则根本无法构建一个字符串但是,以不容易出现shell注入漏洞的方式进行操作很重要,但是:

printf -v exclusions_str '--exclude=%q ' "${SYNC_EXCLUSIONS[@]}"
printf -v rsync_cmd 'rsync --recursive --delete %s %q %q' \
  "$exclusions_str" "$DEPLOYMENT_WORK_DIR/" "$DEPLOYMENT_ROOT/"
eval "$rsync_cmd"

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章