我期望
compgen -A file -G './tmp/*.sh'
只会显示 下的文件tmp/
,但也会显示当前目录中的所有文件。
我努力了
compgen -A file -X '!(tmp/*.sh)'
和
compgen -A file -X "!(tmp/*.sh)"
但两者都会导致空输出。检查设置:
$ shopt|grep extglob
extglob on
还值得注意的是
compgen -A file tmp/*.sh
仅返回第一个有效候选者。顺便说一下,这与默认的行完成结果完全匹配,例如
cp tmp/*.sh[TAB]
和
ls tmp/*.sh[TAB]
两者都扩展到仅第一个候选者。
两个问题:
- 为什么?
- 有什么方法可以仅使用 来获得预期结果
compgen
?
“预期结果”是返回所有匹配的候选者,就像发生的那样ls tmp/*.sh
答案1
@KamilMaciorowski 的评论给出了答案。
我的错误是假设处理文件名时需要“-A file”。仅使用-G 'tmp/*.sh
即可获得所需的结果。
错误的假设是由于有许多-A
选项造成的,例如file
、host
等。但是,当-G
使用 时,作为文件名的域是隐式的,因为 glob 只适用于文件名。