4 votes

La complétion par tabulation des arguments de commande échoue dans Cygwin en raison de l'extension `.exe`.

Existe-t-il une option de configuration dans Cygwin pour que, lorsque Bash complète le nom de la commande, le nom de fichier .exe est ignoré (non inclus) ?


Explication du problème

Lorsque vous utilisez la complétion par tabulation en Bash sur un système Cygwin pour compléter le nom d'une commande, la balise .exe est ajoutée au nom de la commande, par exemple en tapant opens et en appuyant sur Tab complète la commande à openssl.exe .

La commande s'exécute correctement (sous MS Windows, le .exe est facultative lors de l'exécution d'une commande) mais le problème est que l'extension _openssl() fonction d'achèvement fournie par le bash-completion n'est configuré que pour fournir des compléments d'arguments pour les éléments suivants openssl - pas openssl.exe . Par exemple :

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

Le même problème existe lorsque l'on essaie de compléter les arguments de l'option tous des commandes exécutables.

J'utilise actuellement Bash avec le mode Emacs configuré pour l'édition Readline de sorte que je puisse appuyer sur Esc suivi de deux Backspace appuie pour retirer le .exe avant de commencer à taper les arguments de la commande. Idéalement, j'aimerais éviter d'avoir à le faire à chaque fois que je lance une commande.


Ce que j'ai essayé/cherché

Je me suis dit que ce n'était probablement pas possible sans modifier le code source de la DLL Cygwin ou de la complétion de commande de Bash ( pcomplete.c ). Cependant, je remarque que les builtins Bash, type y command dépouille automatiquement le .exe suffixe du nom des fichiers exécutables, par exemple,

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

$ command -v openssl
/usr/bin/openssl

Il semble que Bash, exécuté sous Cygwin, dispose d'un mécanisme permettant de fournir le nom de la commande (sans l'extension de la commande). .exe extension). Cependant, je ne sais pas comment - ou si - cela peut être utilisé pour omettre l'extension de fichier lors de l'exécution des commandes.

8voto

Anthony Geoghegan Points 3521

Il s'avère qu'il y a es une option de configuration dans Cygwin qui configure Bash pour qu'il n'inclue pas l'adresse de l'utilisateur d'un nom de fichier. .exe lorsqu'il complète le nom d'une commande.

Activation de la completion_strip_exe (spécifique au portage Cygwin de Bash) fait ce que je veux :

shopt -s completion_strip_exe

Cette fonctionnalité n'est pas documentée de manière très évidente : elle est mentionnée de manière superficielle dans le document Expansion du nom de chemin de la page de manuel Cygwin pour Bash (il n'est pas inclus dans le code source amont et n'est donc pas documenté dans la page de manuel officielle ou dans la page de manuel de l'entreprise). documentation pour Bash ). Je suis tombé dessus en parcourant /usr/share/doc/Cygwin/bash.README (environ 4 mois après avoir posé cette question) :

7b. L'utilisation de 'shopt -s completion_strip_exe' permet à completion de supprimer les suffixes .exe.

Il semble que cette option soit disponible dans Cygwin Bash depuis plus de 5 ans :

----- version 4.1.9-1 -- 2010-12-29 -----
Ajout des correctifs EXECIGNORE et completion_strip_exe de Dan Colascione.

Une recherche plus poussée montre que le patch pour cette fonctionnalité était soumis par Dan Colascione en novembre 2010 avec le description suivante :

completion_strip_exe est une nouvelle option Shell. Lorsqu'elle est activée, bash essaie d'utiliser le nom court d'un programme au lieu de son nom plus long suffixé ".-exe"-. Avec cette option activée, pin se termine par "ping".

Un grand merci à Dan Colascione (je viens de lui envoyer un mail pour le remercier personnellement) pour cette fonctionnalité et aux mainteneurs de Bash pour avoir fourni un Shell aussi génial.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X