
¿Existe una opción de configuración en Cygwin para que cuando Bash complete el nombre del comando, el .exe
sufijo del nombre del archivo se ignore (no se incluya)?
Explicación del problema.
Cuando se utiliza la función de tabulación en Bash en un sistema Cygwin para completar el nombre de un comando, la .exe
extensión se agrega al nombre del comando, por ejemplo, al escribir opens
y presionar Tabse completa el comando openssl.exe
.
El comando funciona bien (con MS Windows la .exe
extensión es opcional cuando se ejecuta un comando) pero el problema es que la _openssl()
función de finalización proporcionada por elbash-completion
El paquete solo está configurado para proporcionar argumentos completos para openssl
– not openssl.exe
. Por ejemplo:
$ complete -p openssl openssl.exe
complete -o default -F _openssl openssl
bash: complete: openssl.exe: no completion specification
El mismo problema existe cuando se intenta completar argumentos a favortodocomandos ejecutables.
Actualmente uso Bash con el modo Emacs configurado para la edición Readline, por lo que puedo presionar Escseguido de dos Backspacepresiones para eliminar el .exe
sufijo antes de comenzar a escribir los argumentos para el comando. Idealmente, me gustaría evitar tener que hacer esto cada vez que ejecuto un comando.
Lo que he probado/investigado
Pensé que probablemente eso no sea posible sin modificar el código fuente de la DLL Cygwin o la finalización del comando de Bash ( pcomplete.c
). Sin embargo, noto que las funciones integradas de Bash type
eliminan command
automáticamente el .exe
sufijo de los nombres de los archivos ejecutables, por ejemplo,
$ type -a openssl
openssl is /usr/bin/openssl
$ command -v openssl
/usr/bin/openssl
Parece que Bash que se ejecuta en Cygwin tiene algún mecanismo para proporcionar el nombre del comando simple (sin la .exe
extensión). Sin embargo, no sé cómo (o si) se puede usar esto para omitir la extensión del archivo al completar comandos.
Respuesta1
Resulta que hayesuna opción de configuración en Cygwin que configura Bash para que no incluya .exe
la extensión de un nombre de archivo cuando completa el nombre de un comando.
Habilitar la completion_strip_exe
opción (específica del puerto Cygwin de Bash) hace lo que quiero:
shopt -s completion_strip_exe
Esta característica no está documentada de manera muy obvia: recibe una mención superficial en elExpansión de nombre de rutasección de la página de manual de Cygwin para Bash (no está incluida en el código fuente anterior, por lo que no está documentada en la página de manual oficial nidocumentación para bash). Lo encontré mientras leía detenidamente /usr/share/doc/Cygwin/bash.README
(unos 4 meses después de hacer esta pregunta):
7b. el uso de 'shopt -s complete_strip_exe' crea sufijos .exe en la tira de finalización.
Parece que esta opción ha estado disponible en Cygwin Bash desde hace más de 5 años:
----- versión 4.1.9-1 -- 2010-12-29 -----
Agregue los parches EXECIGNORE y complete_strip_exe de Dan Colascione.
Investigaciones adicionales muestran que el parche para esta característica fuepresentado por Dan Colascioneen noviembre de 2010 con elsiguiente descripción:
completion_strip_exe
es una nueva opción de shell. Cuando está habilitado, bash intenta usar el nombre corto de un programa en lugar del más largo con el sufijo ".-exe". Con esto activado, el pin se completa para hacer "ping".
Muchas gracias a Dan Colascione (le acabo de enviar un correo electrónico personal para agradecerle personalmente) por esta característica y a los mantenedores de Bash por proporcionar un shell tan excelente.