¿Cómo expandir los alias en línea en bash?

84

¿Hay alguna manera de expandir los alias en línea en bash?

$bash>alias ll='ls -l '
$bash>ll<tab>
$bash>ls -l 
asdfg
fuente

Respuestas:

107

Puede pulsar Ctrl- Alt- epara realizar la función readline shell-expand-lineque hará alias, la historia y la palabra expansiones. Tenga en cuenta que en algunos teclados Metano lo es Alt. Es posible que deba presionar Escentonces Ctrl:e

Las funciones alias-expand-liney history-and-alias-expand-lineno están vinculadas de forma predeterminada, pero puede vincularlas agregando líneas similares a las siguientes a su ~/.inputrcarchivo.

"\e\C-l": alias-expand-line

lo que haría que Ctrl- Alt- l(minúscula "ell") realizara solo la expansión de alias.

Dennis Williamson
fuente
¿Podemos asignar la expansión de alias a <tab> sin afectar otras terminaciones de bash?
asdfg
2
@asdfg: si lo hace, se romperán otras finalizaciones. Se podría trabajar (no probado) para crear el mapa como se muestra arriba y luego añadir este mapa adicional para reemplazar el existente para Tab: "\C-i": "\e\C-l\e\e"lo que crea una macro que realiza tanto alias-expand-liney complete. Depende del enlace de mi respuesta anterior y de que el enlace predeterminado para Esc-Esc permanezca en su lugar. Aún podría hacer Esc-Esc si quisiera completar por defecto.
Dennis Williamson
44
De hecho, ESC C-efunciona para Bash, pero C-x afunciona para Zsh. También probado en OS X.
Blaz
Si usted está buscando simplemente Ctrl + algo, donde algo puede ser la clave "x", puede hacerlo de esta manera en algunos sistemas: Control-x: history-and-alias-expand-line.
igordcard
1
@WeijunZhou: Eso depende de su administrador de ventanas y de cualquier configuración personalizada que tenga. Para Gnome, por ejemplo, la pantalla de bloqueo es Super + L.
Dennis Williamson
2

En realidad, esta podría ser una forma mucho más simple de hacer lo que está intentando ( bashversión> = 4.2.29):

shopt -s direxpand
shopt -s expand_aliases

shopt's manpágina: https://www.gnu.org/software/bash/manual/html_node/The-Shopt-Builtin.html

starscream_disco_party
fuente
3
Esto está mal. Las opciones de shell "direxpand" y "expand_aliases" no ayudan a expandir los alias en línea como lo especifica la pregunta. No sé de qué sombrero fue tomado "direxpand" ...? Por defecto, "expand_aliases" ya está configurado. Si lo desarma, el resultado es básicamente deshabilitar el funcionamiento de los alias (no se expanden antes de la interpretación de la línea de comando). Por ejemplo, dado un alias, alias ll='ls -lel shell interpretaría 'll' como comando / función 'll' que probablemente no existe.
FooF
0

Esto no funciona. Pero supongo / espero que se pueda hacer algo como esto para hacer lo que quieres hacer. Tendría que usar su propio script de finalización. Así es como haces uno:

_ll()
{
     COMPREPLY=(ls -l)
     #The next line does not work. I just hope there were a way to replace that word
     COMP_WORDS[COMP_CWORD-1]="ls -l"
}
complete -F _ll ll

Ahora obtenga el archivo bash_completion completo ( http://caliban.org/bash ) y coloque el script mencionado anteriormente en un archivo dentro del directorio bash_completion.d que el script que obtiene de las referencias de URL. Avísame si no funciona.

Gracias.

0fnt
fuente
0

Para las personas que tienen instalado zsh y buscan una solución simple, globalias podría ser tu amigo

Expande todas las expresiones globales, subcomandos y alias (incluido global).

# .zsrc:
alias S="sudo systemctl"

$ S<space>
# expands to:
$ sudo systemctl

para instalar simplemente agregue "globalias" a su lista de complementos .zshrc

plugins=(... globalias)

Luego solo presione SPACEpara activar la expansión de un comando que ha escrito.

Si solo desea insertar un espacio sin expandir la línea de comando, presione CTRL+SPACE

lata
fuente