Cómo expandir * en la línea de comando Bash

34

Entiendo que si escribe, ls *en realidad se expande a ls a b ccuando el actual tiene archivos directamente a, by c.

Me preguntaba si hay una manera de expandir esto antes de presionar enter. Similar a cómo funciona Ctrl + X , o la pestaña completa funciona.

Para aclararme

$ ls *
<press magic key>
$ ls a b c

de manera similar a:

$ ls ~/
<press tab>
$ ls /home/username

Pensé que había visto esto antes, pero podría haberme equivocado.

bramp
fuente
Bueno, sé muy poco, pero lo mejor que sé es $ echo * <ENTER> Podrías hacerlo antes del comando ls *. Eso no es exactamente presionar la pestaña o un atajo para expandirlo, por supuesto.
barlop
Pero tal vez los usuarios de Linux no harían nada como ls * much 'porque probablemente no sea necesario con ls, pero también el globbing se comporta de manera diferente en diferentes shells, por lo que no es tan portátil, pero cuando es conveniente, está bien. Pero en el caso de ls, no es necesario. ls * / enumera directorios pero no tanto para lo que está diseñado ls.
barlop

Respuestas:

19

Puedes usar la glob-expand-wordfunción, de man bash:

La palabra antes del punto se trata como un patrón para el nombre de ruta
expansión, y se inserta la lista de nombres de archivo coincidentes,
reemplazando la palabra. Si se proporciona un argumento numérico, un
se agrega un asterisco antes de la expansión del nombre de ruta.

Agregue algo como esto a su ~/.inputrc:

Control-x: glob-expand-word

Entonces, $ ls *seguido de Ctrl-Xse expandirá a $ ls a b c, en su ejemplo.

Ciro
fuente
8
Ya debería estar atado. Y Ctrl-x ya está enlazado como prefijo a un montón de cosas. Haz bind -p | grep 'C-x'para verlos.
Pausado hasta nuevo aviso.
¡Eso es exactamente lo que estaba buscando! Gracias
bramp
@ Dennis, aún no estaba vinculado, pero sí lo agregó a mi .inputrc. Supongo que es el defecto de Debian.
bramp
3
@ Dennis: está obligado a C-x*en mi sistema.
cYrus
23

En bash, se llama a la capacidad de línea de lectura glob-expand-wordy está vinculada CtrlX*de forma predeterminada.

Ignacio Vazquez-Abrams
fuente
11

Cuando está en vimodo ( set -o vi), la "llave mágica" es Esc*. Esto funciona con ambos bashy ksh.

jlliagre
fuente
Solo para que quede claro para los vimmers, primero escriba el asterisco mientras escribe la línea de comando normalmente, luego salga del modo de edición, el cursor se ubicará en el asterisco si escapa inmediatamente, luego presione el asterisco con el cursor ubicado en el asterisco y el globo aparecerá expandir y colocarlo en modo de edición nuevamente.
NeilG
4
$ bind -q glob-expand-word
glob-expand-word se puede invocar a través de "\ Cx *".

$ bind -q insert-completions
las terminaciones de inserción se pueden invocar a través de "\ e *".

Para usar estos podemos hacer

ls * Ctrl+x *

o

ls * Esc *

Expande líneas complicadas antes de presionar enter

Steven Penny
fuente
Esta es la mejor respuesta porque busca la combinación de teclas exacta, que podría ser diferente en diferentes entornos.
wisbucky
0

Una alternativa a glob-expand-word (\ Cx *) es insertar-terminaciones (\ e *). Funciona sin un asterisco al final, pero también incluye otras terminaciones como archivos ocultos. He recuperado ambos en ~ / .inputrc:

# insert glob results (\C-x* by default)
"\C-g": glob-expand-word

# insert completion list (\e* by default)
"\ei": insert-completions

glob-complete-word (\ eg) se puede usar para convertir, por ejemplo, /System/Library/Launch*/*Findera /System/Library/LaunchAgents/com.apple.Finder.plist.

Lri
fuente