键入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
重击版本: GNU bash, version 4.4.20(1)-release (x86_64-pc-linux-gnu)
制表符完成与文件名扩展不同。
制表符完成是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行为。无论外壳是否是交互式的,它都会发生。示例:ssh-copy-id -x *
导致*
扩展到当前目录中的所有文件,命令是否需要它们。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句