Anstatt weiter zu kommentieren ...
complete -f -X '!*.@(zip|udp)' unzip
sollte die Vervollständigung für hinzufügen
-f -X '!*.@(zip|udp)'
| | | |||________|
| | | || |
| | | || +- filterpat: zip or udp
| | | |+------------- @ : Matches one of the given patterns
| | | +-------------- *. : Anything+<dot>
| | +---------------- ! : Negate
| +------------------- -X : Filter out matches in "filterpat"
+---------------------- -f : files
Mit anderen Worten: Vervollständigen Sie Dateien und entfernen Sie alle Dateien, die nicht auf .zip
oder enden .udp
.
Extras
Wenn Sie die -o default
Vervollständigung hinzufügen, werden alle Dateien und Verzeichnisse vervollständigt / abgeglichen, wenn keine Dateien mit .zip
oder enden .udp
.
Wenn Sie die -o plusdirs
Vervollständigung hinzufügen, werden zusätzlich zu den Übereinstimmungen der Dateien, die mit .zip
oder enden, Verzeichnisse hinzugefügt .udp
.
Aktuell
Wenn Sie verwenden, erhalten complete -p unzip
Sie das aktuelle Muster.
In Ihren Kommentaren klingt es meistens so , als ob Sie entweder +
oder @
im Muster fehlen , wie in:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
was bedeuten würde, dass jede Datei übereinstimmt, die buchstäblich auf endet.(zip|udp)
. Z.B
touch 'file_test.(zip|udp)'
Schauen Sie sich auch diesen Abschnitt des Handbuchs an:
es ist möglich, zB extglob
ist nicht aktiviert. Aktivieren durch:
shopt -s extglob
Überprüfen Sie den aktuellen Status aller shopt
Einstellungen, indem Sie Folgendes eingeben:
shopt
Funktion
Wenn -F something
dies der Fall ist, wird eine Funktion mit dem Namen " etwas" verwendet , um die Liste der Vervollständigungen zu generieren.
Dies _filedir_xspec
ist normalerweise eine Debian-Funktion. Sie könnten so etwas haben:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Was bedeutet /usr/share/bash-completion/bash_completion
, beschafft zu werden. Hier finden Sie die betreffende Funktion . Ein paar Zeilen weiter unten sehen Sie, dass diese Funktion / Vervollständigung durch eine Funktion hinzugefügt wird, die _install_xspec
z.
_install_xspec '!*.@(zip|[ejsw]ar|exe|pk3|wsz|zargo|xpi|s[tx][cdiw]|sx[gm]|o[dt][tspgfc]|od[bm]|oxt|epub|apk|do[ct][xm]|p[op]t[mx]|xl[st][xm])' unzip zipinfo
Manuelle Eingaben:
Update auf Kommentare 1:
- Keine Übereinstimmung aufgrund ungültiger Archive oder Dateiberechtigungen.
Dies sollte das Ergebnis nicht beeinflussen. complete
Stimmt nur mit den durch die Regeln angegebenen Dateien überein und verarbeitet die Dateien nicht. Wenn Sie sie auflisten können ls
, sollten sie übereinstimmen.
Als Randnotiz könnte man eine solche Funktionalität hinzufügen, indem man eine vollständige Funktion verwendet:
function _unzip_validated() {
# 1. Generate list of files ending in e.g. .zip and .udp
# 2. Validate each file and remove invalid ones from file list.
}
complete -F _unzip_validated unzip
- Farben. Warum ls
unterscheidet sich test.zip
von test.upd
?
Dies hat keinen Einfluss complete
. Farben von ls
werden bereitgestellt von $LS_COLORS
. Versuchen:
echo "$LS_COLORS" | tr : '\n' | sort
Sie sollten so etwas sehen, *.zip=01;31
was bedeutet:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp
Auf der anderen Seite ist kein Eintrag damit verbunden, also keine Färbung.
Nächster Schritt (hätte zuerst sein sollen)
- Öffnen Sie das Terminal und wechseln Sie in ein Verzeichnis mit Testdateien. Sowohl .zip als auch .udp
- Eingeben
bash --norc
- Eingeben
complete -f -X '!*.@(zip|udp)' unzip
- Eingeben
shopt -s extglob
- Eingeben
unzip <tab><tab>
Ergebnis?
Klicken Sie außerdem unter Ihrer Frage auf Bearbeiten und fügen Sie die Ausgabe von:
bind -V
shopt
env
könnte hilfreich sein.
complete -p unzip
ergibtcomplete -f -X '!*.@(zip|udp)' unzip
undunzip <tab>
vervollständigt die genannte Dateitest.zip
. Das Verzeichnis enthält jedoch auch eine Datei mit dem Namen,test.upd
die beim Ausfüllen der Registerkarte von nicht gefunden wirdunzip
. Erklären die Tatsache von Dateiberechtigungen oder eine Länge der Datei von Null möglicherweise dieses seltsame Verhalten?