Bash 如何知道何时进行文件名扩展?

shp*_*ram 3 bash autocomplete

键入ssh-copy-id -i ~/.ssh/,然后Tab导致文件名扩展,其中列出~/.ssh.

键入ssh-copy-id不带-i标志,那么SpacebarTab不会导致文件扩展。

键入ssh-copy-id -x, Spacebard, Tab(注意这-x是一个无效标志)也不会导致文件扩展。

键入后 Bash 如何“知道”进行文件扩展-i?程序是否ssh-copy-id必须以某种方式让 Bash 知道这样做?我阅读了有关文件名扩展的此页面和其他页面,但找不到我的问题的答案:https : //www.gnu.org/software/bash/manual/html_node/Filename-Expansion.html

bash 版本: GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)

Qua*_*odo 10

制表符补全不同于文件名扩展。

Tab-completion是 Bash GNU Readline 的一个原生特性,用于交互式 Bash 会话。例如,它完成变量(tryecho $SH<TAB>)并且还命令带有文件名的参数。

此外,如果bash-completion安装了包,则包含在 中的命令的完成变得更加智能/usr/share/bash-completion/completions,其中之一是 ssh-copy-id. 由于-i标志ssh-copy-id需要一个文件,所以它会用制表符完成文件。如果没有-i,则提供文件没有意义,因此不会执行完成。

同样,这仅适用于completions目录中的命令。如果你有一个foobar不接受文件作为参数的命令,Bash 仍然会完成文件,因为bash-completion 不知道foobar.

另一方面,文件名扩展是一种 POSIX shell 行为。不管 shell 是否是交互式的,它都会发生。示例:ssh-copy-id -x *导致*扩展到当前目录中的所有文件,命令是否需要它们。

  • Tab 完成本身(主要是文件名)是 Bash 本身的一个特性。尝试猜测您想要 tab-complete 的每个实用程序配置是`bash-completion` 的一部分。 (2认同)