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 .zipoder enden .udp.
Extras
Wenn Sie die -o defaultVervollständigung hinzufügen, werden alle Dateien und Verzeichnisse vervollständigt / abgeglichen, wenn keine Dateien mit .zipoder enden .udp.
Wenn Sie die -o plusdirsVervollständigung hinzufügen, werden zusätzlich zu den Übereinstimmungen der Dateien, die mit .zipoder enden, Verzeichnisse hinzugefügt .udp.
Aktuell
Wenn Sie verwenden, erhalten complete -p unzipSie 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 extglobist nicht aktiviert. Aktivieren durch:
shopt -s extglob
Überprüfen Sie den aktuellen Status aller shoptEinstellungen, indem Sie Folgendes eingeben:
shopt
Funktion
Wenn -F somethingdies der Fall ist, wird eine Funktion mit dem Namen " etwas" verwendet , um die Liste der Vervollständigungen zu generieren.
Dies _filedir_xspecist 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_xspecz.
_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. completeStimmt 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 lsunterscheidet sich test.zipvon test.upd?
Dies hat keinen Einfluss complete. Farben von lswerden bereitgestellt von $LS_COLORS. Versuchen:
echo "$LS_COLORS" | tr : '\n' | sort
Sie sollten so etwas sehen, *.zip=01;31was 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 unzipergibtcomplete -f -X '!*.@(zip|udp)' unzipundunzip <tab>vervollständigt die genannte Dateitest.zip. Das Verzeichnis enthält jedoch auch eine Datei mit dem Namen,test.upddie 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?