Entendo que o preenchimento automático do bash funciona para utilitários padrão. Mas como ele faz o preenchimento automático de programas personalizados como o Oracle SQL loader?
No comando a seguir, se você tabular depois control=
, ele será preenchido automaticamente com o nome do arquivo de controle:
sqlldr kshitiz/oracle@XE control=data.ctl data=data.csv bad=data.bad log=data.log
Como ele sabe que precisa preencher o arquivo de controle naquele momento e não outro arquivo?
bash
autocomplete
Kshitiz Sharma
fonte
fonte
/etc/bash_completion.d
. Veja também/etc/bash_completion
e dê uma olhada na saída deset
quanto seu ambiente cresceu.gdbus-bash-completion.sh
gvfs-bash-completion.sh
pk-completion.bash
yum.bash
. A saída deset
é igualmente desinteressante./etc/profile.d
. Ou talvez o seu.bash_profile
ou tenha.bashrc
sido modificado.bash-completion
carrega conclusões dinamicamente desde então1.90
. Tente:sqlldr<space><tab><enter>
. Então digitecomplete -p sqlldr
.Respostas:
A conclusão programável do Bash funciona analisando a linha de comando e descobrindo o que está sendo concluído:
$
é concluída como um nome de variável, etc.Por exemplo, depois , o bash conclui os nomes dos comandos que começam com . Depois , o bash completa os nomes de variáveis que começam com . Depois , o bash aplica as regras de conclusão para o comando . As regras de conclusão podem especificar uma categoria (usuário, variável, arquivos etc.), um padrão curinga para nomes de arquivo ou uma função ou trecho de código a ser executado.
sqllTab
sqll
sqlldr $aTab
a
sqlldr Tab
sqlldr
As regras de conclusão são definidas pelo
complete
builtin. O Bash não controla quando ocomplete
builtin foi chamado ou em qual script (se houver) ele estava. A maioria das distribuições envia o pacote bash-complete , que fornece uma série de regras para comandos comuns. Isso assume a forma de uma série de arquivos de script que contêm chamadas paracomplete
, com um script que deve ser lido.bashrc
(ou/etc/bash.bashrc
se implementado) para carregar todos esses scripts: normalmente. /etc/bash_completion
é necessário para ativar a conclusão programável e carregar os scripts disponíveis.O pacote padrão não inclui suporte para
sqlldr
. Se você tiver esse suporte, ele deve ser de uma fonte diferente. Essa fonte pode ter descartado um arquivo em um diretório como/etc/bash_completion.d
ou pode ter fornecido instruções para incluir algum código no seu.bashrc
. Você pode usarcomplete -p sqlldr
para ver as regras atuais parasqlldr
; como mencionado anteriormente, isso não informará de onde essas regras foram carregadas.O tcsh, o zsh e o fish têm mecanismos semelhantes (todos se inspiraram no tcsh), mas com diferentes componentes, sintaxes e recursos.
fonte
complete
foi chamado. Mas você pode encontrar o nome do arquivo de origem e o número da linha em que a função de conclusão está definida.complete -p sudo # outputs complete -F _sudo sudo
,shopt -s extdebug
,declare -F _sudo # outputs _sudo 3 /usr/share/bash-completion/completions/sudo
. (Mas veja meu comentário sobre conclusões dinâmicas carregando ecomplete -p
).and the settings for the basename of the command are applied
. Não. Você pode ter diferentes compspecs paradate
e/bin/date
. A referência diz : Se a palavra de comando for um nome de caminho completo, primeiro será procurado um compspec para o nome de caminho completo. Se nenhum compspec for encontrado para o nome do caminho completo, é feita uma tentativa de encontrar um compspec para a parte após a barra final