Die Tab-Vervollständigung von Befehlsargumenten schlägt in Cygwin aufgrund der Erweiterung ".exe" fehl

4

Gibt es eine Konfigurationsoption in Cygwin, so dass, wenn Bash den Namen des Befehls abschließt, der Dateiname .exe Suffix wird ignoriert (nicht enthalten)?


Erklärung des Problems

Wenn Sie in einem Cygwin-System die Tab-Vervollständigung in Bash verwenden, um den Namen eines Befehls zu vervollständigen, die .exe Erweiterung wird an den Befehlsnamen angehängt, z. B. Eingabe opens und drücken Tab schließt den Befehl an openssl.exe.

Der Befehl läuft einwandfrei (bei MS Windows das .exe Erweiterung ist optional, wenn ein Befehl ausgeführt wird), aber das Problem ist, dass die _openssl() Abschlußfunktion durch die bash-completion package ist nur so konfiguriert, dass es Vervollständigungen von Argumenten für bereitstellt openssl - nicht openssl.exe. Zum Beispiel:

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

Das gleiche Problem besteht beim Versuch, Argumente für zu vervollständigen alles ausführbare Befehle.

Ich verwende derzeit Bash mit dem für die Readline-Bearbeitung konfigurierten Emacs-Modus, damit ich drücken kann Esc gefolgt von zwei Rücktaste drückt, um das zu entfernen .exe Suffix, bevor ich die Argumente für den Befehl eingebe. Im Idealfall möchte ich vermeiden, dass ich dies jedes Mal tun muss, wenn ich einen Befehl ausführen.


Was ich ausprobiert habe

Ich dachte mir, dass dies wahrscheinlich nicht möglich ist, ohne den Quellcode der Cygwin-DLL oder den Abschluss des Befehls von Bash zu ändern ( pcomplete.c ). Ich bemerke jedoch, dass die Bash Builtins, type und command automatisch entfernen .exe Suffix aus den Namen der ausführbaren Dateien, z.

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

$ command -v openssl
/usr/bin/openssl

Es scheint, dass Bash in Cygwin über einen Mechanismus verfügt, der den bloßen Befehlsnamen bereitstellt (ohne den .exe Erweiterung). Ich habe jedoch keine Ahnung, wie - oder ob - die Dateierweiterung beim Ausführen von Befehlen weggelassen werden kann

Anthony Geoghegan
quelle

Antworten:

5

Es stellt sich heraus, dass dort ist eine Konfigurationsoption in Cygwin, die Bash so konfiguriert, dass keine Dateinamen enthalten sind .exe Erweiterung, wenn der Name eines Befehls abgeschlossen ist.

Aktivieren der completion_strip_exe Option (spezifisch für den Cygwin-Port von Bash) macht, was ich will:

shopt -s completion_strip_exe

Dieses Feature ist nicht sehr offensichtlich dokumentiert: Es wird eine flüchtige Erwähnung in der Pfadname Erweiterung Abschnitt der Cygwin-Manpage für Bash (ist nicht im Upstream-Quellcode enthalten und daher nicht in der offiziellen Manpage oder dokumentiert Dokumentation für Bash ). Ich bin beim Durchlesen darauf gestoßen /usr/share/doc/Cygwin/bash.README (etwa 4 Monate nach dem Stellen dieser Frage):

7b. Die Verwendung von 'shopt -s completion_strip_exe' führt dazu, dass .exe-Suffixe entfernt werden.

Es scheint, dass diese Option seit über 5 Jahren in Cygwin Bash verfügbar ist:

----- Version 4.1.9-1 - 2010-12-29 -----
Fügen Sie von Dan Colascione die Patches EXECIGNORE und completion_strip_exe hinzu.

Weitere Untersuchungen zeigen, dass der Patch für dieses Feature war eingereicht von Dan Colascione zurück im November 2010 mit der folgende Beschreibung :

completion_strip_exe ist eine neue Shell-Option. Wenn diese Option aktiviert ist, versucht bash, den Kurznamen eines Programms anstelle des längeren ".-Exe" -Suffixes zu verwenden. Wenn diese Option aktiviert ist, wird der Pin mit "Ping" abgeschlossen.

Vielen Dank an Dan Colascione (ich habe ihm gerade eine persönliche E-Mail geschickt, um sich persönlich zu bedanken) für dieses Feature und die Bash-Betreuer für die Bereitstellung einer solch großartigen Hülle.

Anthony Geoghegan
quelle