Obtém as ações para um comando programaticamente

5

Vamos pegar o exemplo 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    

Observe que depois de 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--

Escrevendo 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           

Geralmente:

$ command <tab> 
[actions]

Como posso obter essas ações programaticamente? Isso é possível através de um script shell / bash?

    
por Ionică Bizău 11.04.2014 / 11:29

2 respostas

7

Este recurso está sendo feito pelo que é chamado de Bash Completion. Os arquivos que retornam isso são armazenados em /etc/bash_completion.d , com cada comando tendo seu próprio arquivo. Então, no caso git :

/etc/bash_completion.d/git

Se você observar esse arquivo, perceberá que ele sobrecarrega seu ambiente com funções extras. Um em particular é esse cara:

$ __git_commands

Quando você executá-lo, você obterá a lista de subcomandos.

$ __git_commands | head -5
  add                       merge-recursive
  add--interactive          merge-resolve
  am                        merge-subtree
  annotate                  merge-tree
  apply                     mergetool

Sabendo que estas são simplesmente funções no seu ambiente, você pode fazer isso:

$ __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   

Para obter uma lista de todas as funções de Bash Completion que fornecem várias informações sobre git do comando.

    
por 11.04.2014 / 11:52
2

O que você está vendo aqui é chamado de conclusão programável . Em sistemas baseados em Debian / Ubunutu, os pacotes geralmente instalam um arquivo em /usr/share/bash-completion/completions , que fornece a conclusão programável para o comando. Em outras distribuições, o diretório /etc/bash_completion.d pode ser usado (esta localização está obsoleta no Debian / Ubuntu, mas alguns pacotes ainda usam). Para mim, o arquivo contendo as funções que geram as conclusões para git é /usr/share/bash-completion/completions/ .

O processo básico é que são definidas funções que geram conteúdo para o array COMPREPLY shell, estas são então registradas em comandos particulares usando o complete shell embutido.

Se você quiser alterar a maneira como a conclusão funciona, é melhor não alterar esses arquivos diretamente, pois qualquer alteração pode ser prejudicada pelas atualizações do sistema, mas criar novas versões das funções necessárias em um local específico do usuário, como .bashrc no diretório inicial.

    
por 11.04.2014 / 11:58