Bash辅助脚本中compgen扩展glob时部分文件名无法传递的问题
问题排查与解决
核心原因:Shell默认不匹配隐藏文件
Bash默认的glob规则里,*、?这类通配符不会匹配以.开头的文件/目录(即隐藏文件),而compgen默认继承了这个行为,所以你的辅助脚本处理时会漏掉这些隐藏文件。至于直接在命令行能工作,大概率是你的交互式shell已经开启了dotglob选项,而脚本默认以非交互模式运行,不会加载个人shell配置里的相关设置。
具体修正方案
在辅助脚本中显式开启
dotglob选项
在expand-globs-in-file.sh的开头添加这行代码,让shell的glob扩展包含隐藏文件:shopt -s dotglob如果需要严格恢复环境,处理完glob扩展后可以关闭该选项:
shopt -u dotglob检查
compgen的调用逻辑
确保你用compgen -G "$pattern"的方式调用,开启dotglob后就能正确匹配到隐藏文件。示例辅助脚本框架:#!/bin/bash shopt -s dotglob while read -r pattern; do compgen -G "$pattern" done < "$1"验证rsync输入格式
确保扩展后的文件列表每行一个路径,无多余引号或转义字符,符合--files-from的要求。
内容的提问来源于stack exchange,提问作者Al Pacifico
相关产品推荐
相关产品推荐

