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

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

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

键入ssh-copy-id不带-i标志的 thenSpacebar不会Tab导致文件扩展。

键入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

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

答案1

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

Tab 补全是 Bash GNU Readline 的原生功能,用于交互式 Bash 会话。例如,它完成变量(try echo $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 *导致*扩展到当前目录中的所有文件,无论命令是否需要它们。

相关内容