`compgen -A file -G './tmp/*.sh` 意外地显示目录 ./ 中的所有文件以及所需的文件

`compgen -A file -G './tmp/*.sh` 意外地显示目录 ./ 中的所有文件以及所需的文件

我期望

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]

两者都扩展到仅第一个候选者。

两个问题:

  1. 为什么?
  2. 有什么方法可以仅使用 来获得预期结果compgen

“预期结果”是返回所有匹配的候选者,就像发生的那样ls tmp/*.sh

答案1

@KamilMaciorowski 的评论给出了答案。

我的错误是假设处理文件名时需要“-A file”。仅使用-G 'tmp/*.sh即可获得所需的结果。

错误的假设是由于有许多-A选项造成的,例如filehost等。但是,当-G使用 时,作为文件名的域是隐式的,因为 glob 只适用于文件名。

相关内容