![`compgen -A file -G './tmp/*.sh` 意外地显示目录 ./ 中的所有文件以及所需的文件](https://linux22.com/image/175840/%60compgen%20-A%20file%20-G%20'.%2Ftmp%2F*.sh%60%20%E6%84%8F%E5%A4%96%E5%9C%B0%E6%98%BE%E7%A4%BA%E7%9B%AE%E5%BD%95%20.%2F%20%E4%B8%AD%E7%9A%84%E6%89%80%E6%9C%89%E6%96%87%E4%BB%B6%E4%BB%A5%E5%8F%8A%E6%89%80%E9%9C%80%E7%9A%84%E6%96%87%E4%BB%B6.png)
我期望
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 只适用于文件名。