如果你查看文件,你会发现/usr/share/bash-completion/completions/*
许多文件后面都有函数定义&& complete -F
(至少在 Xenial 中)。这是为什么?
这个符号在 bash 完成文件中是否有一些特殊含义?
在 bash 中,我没有看到脚本之间的任何功能差异
a(){ echo in;return 1;} && a
和
a(){ echo in;return 1;}; a
答案1
函数定义的退出状态为零,除非发生语法错误或已存在同名的只读函数。执行时,函数的退出状态是函数体中执行的最后一个命令的退出状态。
语法错误可能会在complete -F
命令之前终止脚本执行,因此函数声明后的命令可能不会被执行,但如果在获取包含该函数的文件之前声明了同名的只读函数,则可能不会终止执行。为了防止调用错误的 bash 完成函数,使用了这种逻辑 AND 测试。
答案2
complete
是狂欢内置,它告诉狂欢如何在各种情况下自动完成。特别是,complete -F
函数名 命令名称告诉狂欢如果用户输入了命令命令名称那么参数的完成将由函数处理函数名. 使用help complete
和man bash
获取更多信息。许多系统安装的自动完成文件使用模式安装自动完成功能
_cmd_name () {
... compute completions here and assign them to COMPREPLY ...
return 0
} && complete -F _cmd_name cmd_name
例如,
_apt_get () {
... compute completions here and assign them to COMPREPLY ...
return 0
} && complete -F _apt_get apt-get
这告诉我们狂欢如果用户使用类型apt-get
作为命令名称,那么自动完成将由该函数处理_apt_get
。
这纯粹是编码样式的问题,而且这种风格并不丑陋或难以理解。