A conclusão da guia para argumentos de comando falha no Cygwin devido à extensão `.exe`

A conclusão da guia para argumentos de comando falha no Cygwin devido à extensão `.exe`

Existe uma opção de configuração no Cygwin para que quando o Bash completar o nome do comando, o .exesufixo do nome do arquivo seja ignorado (não incluído)?


Explicação do problema

Ao usar o preenchimento de tabulação no Bash em um sistema Cygwin para completar o nome de um comando, a .exeextensão é anexada ao nome do comando, por exemplo, digitar opense pressionar Tabcompleta o comando para openssl.exe.

O comando funciona bem (no MS Windows a .exeextensão é opcional ao executar um comando), mas o problema é que a _openssl()função de conclusão fornecida pelobash-completionpackage é configurado apenas para fornecer conclusões de argumentos para openssl– not openssl.exe. Por exemplo:

$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification

O mesmo problema existe ao tentar completar argumentos paratodoscomandos executáveis.

Atualmente uso o Bash com o modo Emacs configurado para edição Readline para que eu possa pressionar Escseguido de dois Backspacepressionamentos para remover o .exesufixo antes de começar a digitar os argumentos do comando. Idealmente, gostaria de evitar ter que fazer isso toda vez que executar um comando.


O que eu tentei/pesquisei

Achei que isso provavelmente não seria possível sem modificar o código-fonte da DLL Cygwin ou da conclusão do comando do Bash ( pcomplete.c). No entanto, noto que os recursos internos do Bash typeremovem commandautomaticamente o .exesufixo dos nomes dos arquivos executáveis, por exemplo,

$ type -a openssl
openssl is /usr/bin/openssl

$ command -v openssl
/usr/bin/openssl

Parece que o Bash em execução no Cygwin possui algum mecanismo para fornecer o nome do comando simples (sem a .exeextensão). No entanto, não sei como - ou se - isso pode ser usado para omitir a extensão do arquivo ao concluir comandos.

Responder1

Acontece que háéuma opção de configuração no Cygwin que configura o Bash para não incluir uma extensão de nome de arquivo .exeao completar o nome de um comando.

Habilitar a completion_strip_exeopção (específica para a porta Cygwin do Bash) faz o que eu quero:

shopt -s completion_strip_exe

Este recurso não está documentado de forma muito óbvia: ele é mencionado superficialmente noExpansão do nome do caminhoseção da página de manual do Cygwin para Bash (ela não está incluída no código-fonte upstream, portanto não está documentada na página de manual oficial oudocumentação para Bash). Me deparei com isso durante a leitura /usr/share/doc/Cygwin/bash.README(cerca de 4 meses depois de fazer esta pergunta):

7b. usar 'shopt -s complete_strip_exe' cria sufixos .exe da faixa de conclusão.

Parece que esta opção está disponível no Cygwin Bash há mais de 5 anos:

----- versão 4.1.9-1 -- 2010-12-29 -----
Adicione os patches EXECIGNORE e complete_strip_exe de Dan Colascione.

Outras pesquisas mostram que o patch para esse recurso foienviado por Dan Colascioneem novembro de 2010 com oseguinte descrição:

completion_strip_exeé uma nova opção de shell. Quando ativado, o bash tenta usar o nome abreviado de um programa em vez do nome mais longo com o sufixo ".-exe". Com isso ativado, o pin é concluído para "ping".

Muito obrigado a Dan Colascione (acabei de enviar a ele um e-mail pessoal para agradecê-lo pessoalmente) por esse recurso e aos mantenedores do Bash por fornecerem um shell tão excelente.

informação relacionada