键入ssh-copy-id -i ~/.ssh/
,然后Tab导致文件名扩展,其中列出~/.ssh
.
键入ssh-copy-id
不带-i
标志,那么Spacebar,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
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 *
导致*
扩展到当前目录中的所有文件,命令是否需要它们。