Jenkins SSH部署报错:删除/var/www/html文件排除app2目录出现语法错误
错误原因
这个语法错误的本质是bash的命令解析优先级问题:bash会先对整行命令做语法校验,再逐行执行命令。你在同一行里先写shopt -s extglob再用!(app2)扩展通配符的时候,bash解析到!(的时候,shopt命令还没执行,extglob模式尚未开启,所以会把(识别为非法字符抛出语法错误。
解决方案
方案1:使用find命令(兼容性最优,推荐生产环境使用)
无需依赖bash的扩展通配符特性,所有Linux发行版默认支持:
cd /var/www/html && find . -maxdepth 1 ! -name 'app2' ! -name '.' -exec rm -rf {} + && mv /var/tmp/MyApp/* /var/www/html/
参数说明:
-maxdepth 1仅扫描当前目录层级,不会递归处理子目录内容! -name 'app2'过滤掉名为app2的目录不删除! -name '.'排除当前目录本身,避免误操作-exec rm -rf {} +将所有匹配到的文件/目录批量传递给rm命令删除
方案2:启动bash时直接开启extglob模式
显式调用bash并在启动时开启扩展通配符,让语法校验阶段就能识别!()语法:
bash -O extglob -c 'cd /var/www/html && rm -rf !(app2) && mv /var/tmp/MyApp/* /var/www/html/'
方案3:循环遍历判断删除
不需要依赖任何扩展特性,逻辑更直观:
cd /var/www/html && for f in *; do [ "$f" != "app2" ] && rm -rf "$f"; done && mv /var/tmp/MyApp/* /var/www/html/
内容的提问来源于stack exchange,提问作者Narayanan Ramanathan
相关产品推荐
相关产品推荐

