键入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 *
导致*
扩展到当前目录中的所有文件,无论命令是否需要它们。