我正在使用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] 删除。
我来说两句