
.exe
Gibt es in Cygwin eine Konfigurationsoption, sodass das Suffix des Dateinamens ignoriert (nicht eingeschlossen) wird, wenn Bash den Befehlsnamen vervollständigt ?
Erklärung des Problems
Wenn Sie in Bash auf einem Cygwin-System die Tabulatorvervollständigung verwenden, um den Namen eines Befehls zu vervollständigen, .exe
wird die Erweiterung an den Befehlsnamen angehängt. Wenn Sie beispielsweise eingeben opens
und drücken, Tabwird der Befehl zu vervollständigt openssl.exe
.
Der Befehl läuft einwandfrei (unter MS Windows .exe
ist die Erweiterung bei der Ausführung eines Befehls optional), aber das Problem ist, dass die _openssl()
Vervollständigungsfunktion desbash-completion
Das Paket ist nur so konfiguriert, dass es Vervollständigungen von Argumenten für openssl
– und nicht für – bereitstellt openssl.exe
. 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 zu vervollständigen füralleausführbare Befehle.
Ich verwende derzeit Bash mit dem für die Readline-Bearbeitung konfigurierten Emacs-Modus, sodass ich drücken Escund dann zweimal Backspacedrücken kann, um das .exe
Suffix zu entfernen, bevor ich anfange, die Argumente für den Befehl einzugeben. Idealerweise möchte ich vermeiden, dies jedes Mal tun zu müssen, wenn ich einen Befehl ausführe.
Was ich versucht/recherchiert habe
Ich dachte, das ist wahrscheinlich nicht möglich, ohne den Quellcode der Cygwin-DLL oder der Befehlsvervollständigung von Bash ( pcomplete.c
) zu ändern. Allerdings stelle ich fest, dass die integrierten Bash-Programme type
das Suffix command
automatisch .exe
aus den Namen ausführbarer Dateien entfernen, z. B.
$ type -a openssl
openssl is /usr/bin/openssl
$ command -v openssl
/usr/bin/openssl
Es scheint, dass Bash unter Cygwin über einen Mechanismus verfügt, der den reinen Befehlsnamen (ohne die .exe
Erweiterung) bereitstellt. Ich weiß jedoch nicht, wie – oder ob – dieser verwendet werden kann, um die Dateierweiterung beim Vervollständigen von Befehlen wegzulassen.
Antwort1
Es stellt sich heraus, dass esIsteine Konfigurationsoption in Cygwin, die Bash so konfiguriert, dass die Dateinamenerweiterung .exe
bei der Vervollständigung des Namens eines Befehls nicht einbezogen wird.
Das Aktivieren der completion_strip_exe
Option (speziell für den Cygwin-Port von Bash) bewirkt, was ich möchte:
shopt -s completion_strip_exe
Dieses Feature ist nicht sehr offensichtlich dokumentiert: es wird nur flüchtig erwähnt in derPfadnamenerweiterungAbschnitt der Cygwin-Manpage für Bash (es ist nicht im Upstream-Quellcode enthalten und daher nicht in der offiziellen Manpage dokumentiert oderDokumentation für Bash). Ich bin beim Durchlesen darauf gestoßen /usr/share/doc/Cygwin/bash.README
(ungefähr 4 Monate, nachdem ich diese Frage gestellt hatte):
7b. Die Verwendung von „shopt -s completion_strip_exe“ bewirkt, dass die Vervollständigung die .exe-Suffixe entfernt.
Es scheint, dass diese Option in Cygwin Bash seit über 5 Jahren verfügbar ist:
----- Version 4.1.9-1 – 29.12.2010 -----
EXECIGNORE- und completion_strip_exe-Patches von Dan Colascione hinzufügen.
Weitere Untersuchungen zeigen, dass der Patch für diese Funktioneingereicht von Dan Colascioneim November 2010 mit demfolgende Beschreibung:
completion_strip_exe
ist eine neue Shell-Option. Wenn diese Option aktiviert ist, versucht Bash, den Kurznamen eines Programms zu verwenden, anstatt den längeren mit der Endung „.-exe“. Wenn diese Option aktiviert ist, wird Pin zu „Ping“ vervollständigt.
Vielen Dank an Dan Colascione (ich habe ihm gerade eine persönliche E-Mail geschickt, um ihm persönlich zu danken) für diese Funktion und an die Bash-Betreuer für die Bereitstellung einer so großartigen Shell.