我们来看一个git
例子:
$ git<TAB><TAB>
git git-import-dscs git-shell
git-buildpackage git-import-orig git-upload-archive
git-dch git-pbuilder git-upload-pack
git-import-dsc git-receive-pack
注意后面的git
:
$ git <tab><tab>
add fetch push
am filter-branch rebase
annotate format-patch reflog
apply fsck relink
archive gc remote
bisect get-tar-commit-id repack
blame grep replace
branch help request-pull
buildpackage imap-send reset
bundle import-dsc revert
checkout import-dscs rm
cherry import-orig shortlog
cherry-pick init show
clean instaweb show-branch
clone log stage
column merge stash
commit mergetool status
config mv submodule
credential name-rev subtree
--More--
写作git re
$ git re<tab><tab>
rebase relink repack request-pull revert
reflog remote replace reset
$ git remote <tab><tab>
add remove set-branches set-url update
prune rename set-head show
一般来说:
$ command <tab>
[actions]
我如何以编程方式获取这些操作?这可以通过 shell/bash 脚本实现吗?
答案1
这个功能是通过所谓的 Bash Completion 来完成的。支持此操作的文件存储在/etc/bash_completion.d
每个命令都有其自己的文件的目录下。所以在这种git
情况下:
/etc/bash_completion.d/git
如果您查看此文件,您会发现它使用额外的功能使您的环境超载。特别是这个人:
$ __git_commands
当您运行它时,您将获得子命令列表。
$ __git_commands | head -5
add merge-recursive
add--interactive merge-resolve
am merge-subtree
annotate merge-tree
apply mergetool
知道这些只是您环境中的功能,您可以执行以下操作:
$ __git<tab><tab>
__git_aliased_command __git_complete_remote_or_refspec __git_diff_index_files __git_index_files __git_refs
__git_aliases __git_complete_revlist __git_diff_index_helper __gitk_main __git_refs2
__git_commands __git_complete_revlist_file __gitdir __git_list_all_commands __git_refs_remotes
__gitcomp __git_complete_strategy __git_find_on_cmdline __git_list_merge_strategies __git_remotes
__gitcompadd __gitcomp_nl __git_func_wrap __git_list_porcelain_commands __git_tags
__gitcomp_file __git_compute_all_commands __git_has_doubledash __git_ls_files_helper __git_wrap__gitk_main
__git_complete __git_compute_merge_strategies __git_heads __git_main __git_wrap__git_main
__git_complete_diff_index_file __git_compute_porcelain_commands __git_index_file_list_filter __git_match_ctag
__git_complete_file __git_config_get_set_variables __git_index_file_list_filter_bash __git_pretty_aliases
__git_complete_index_file __git_count_arguments __git_index_file_list_filter_compat __git_reassemble_comp_words_by_ref
获取所有 Bash Completion 函数的列表,这些函数提供有关git
命令的各种信息。
答案2
你在这里看到的东西叫做可编程完成。在基于 Debian/Ubunutu 的系统上,软件包通常会安装一个文件,/usr/share/bash-completion/completions
该文件为命令提供可编程完成。在其他发行版上,/etc/bash_completion.d
可能会使用该目录(Debian/Ubuntu 上不推荐使用此位置,但某些软件包仍然使用它)。对我来说,包含生成补全的函数的文件git
是/usr/share/bash-completion/completions/
.
基本过程是定义为 shell 数组生成内容的函数,然后使用shell 内置函数COMPREPLY
将这些内容注册到特定命令。complete
如果您想改变完成的工作方式,最好不要直接更改这些文件,因为任何更改都可能会被系统更新破坏,而是在用户特定位置(例如.bashrc
在家里)创建必要功能的新版本目录。