En lugar de seguir comentando ...
complete -f -X '!*.@(zip|udp)' unzip
debería agregar terminación para
-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
En otras palabras: complete los archivos y elimine todos los que no terminen en .zipo .udp.
Extras
Si agrega -o defaultfinalización, completará / coincidirá todos los archivos y directorios si no hay archivos que terminen en .zipo .udp.
Si agrega -o plusdirsfinalización agregará cualquier directorio además de cualquier coincidencia de archivos que terminen en .zipo .udp.
Actual
Cuando lo complete -p unzipusas obtienes el patrón actual.
De sus comentarios, suena principalmente como si faltara +o @en el patrón, como en:
# Err:
complete -f -X '!*.(zip|udp)' unzip
|
+---- Missing + or @
lo que significaría coincidir con cualquier archivo que literalmente termine en.(zip|udp) . P.ej
touch 'file_test.(zip|udp)'
También eche un vistazo a esta sección del manual:
es posible, por ejemplo, extglobno está habilitado. Habilitar por:
shopt -s extglob
Verifique el estado actual de todas las shoptconfiguraciones ingresando:
shopt
Función
Si es -F somethingasí, significa que utiliza una función llamada algo para generar la lista de finalizaciones.
El _filedir_xspeces típicamente una función Debian. Puede que tengas algo como esto:
$ cat /etc/bash_completion
. /usr/share/bash-completion/bash_completion
Lo que significa /usr/share/bash-completion/bash_completionobtener fuentes. Aquí encontrarás la función en cuestión . Algunas líneas más abajo, verá que esta función / finalización se agrega mediante una función denominada, _install_xspecpor ejemplo:
_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
Entradas manuales:
Actualización a los comentarios 1:
- No coincide debido a archivos inválidos o permisos de archivo.
Esto no debería afectar el resultado. completesolo coincide con los archivos dados por las reglas y no procesa los archivos. Si puede enumerarlos ls, deberían coincidir.
Como nota al margen, se podría agregar dicha funcionalidad mediante el uso de una función completa:
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
- Colores. ¿Por qué lsdistinguir test.zipde test.upd?
Esto no afecta complete. Los colores lsson proporcionados por $LS_COLORS. Tratar:
echo "$LS_COLORS" | tr : '\n' | sort
Deberías ver algo como lo *.zip=01;31que significa:
*.zip=01;31
|____| | |
| | +--- Red
| +------ Bold
+---------- Files with .zip extension
*.udp Por otro lado, no tiene ninguna entrada asociada, por lo que no tiene color.
Siguiente paso (debería haber sido el primero)
- Abra la terminal y vaya a un directorio con archivos de prueba. Tanto .zip como .udp
- Entrar
bash --norc
- Entrar
complete -f -X '!*.@(zip|udp)' unzip
- Entrar
shopt -s extglob
- Entrar
unzip <tab><tab>
¿Resultado?
Además, haga clic en editar debajo de su pregunta y agregue la salida de:
bind -V
shopt
env
Podría ser útil.
complete -p unzipcedecomplete -f -X '!*.@(zip|udp)' unzipyunzip <tab>completa el archivo llamadotest.zip. Sin embargo, el directorio también contiene un archivo llamadotest.updque no se encuentra al completar la pestañaunzip. ¿El hecho de los permisos de archivo o una longitud cero del archivo puede explicar este comportamiento extraño?