como expandir aliases embutidos no bash?


84

Existe uma maneira de expandir aliases embutidos no bash?

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

Respostas:


107

Você pode pressionar Ctrl- Alt- epara executar a função readline, shell-expand-lineque fará o alias, histórico e expansões de palavras. Observe que em alguns teclados Metanão é Alt. Talvez seja necessário pressionar Escem seguida Ctrl-e

As funções alias-expand-linee history-and-alias-expand-linenão são vinculadas por padrão, mas você pode vinculá-las adicionando linhas semelhantes à seguinte ao seu ~/.inputrcarquivo.

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

o que faria Ctrl- Alt- l(minúsculas "ell") executar apenas a expansão de alias.


Podemos mapear a expansão de alias para <tab> sem afetar outras conclusões do bash ?.
asdfg

2
@asdfg: Se você o fizer, ele quebrará outras conclusões. Ele pode trabalhar (não testado) para criar o mapa, como mostrado acima e, em seguida, adicionar este mapa adicional para substituir o existente para Tab: "\C-i": "\e\C-l\e\e"o que cria uma macro que executa tanto alias-expand-linee complete. Depende da ligação da minha resposta acima e que a ligação padrão para o Esc-Esc permaneça em vigor. Você ainda poderá executar o Esc-Esc se quiser fazer a conclusão padrão.
Dennis Williamson

4
De fato, ESC C-efunciona para o Bash, mas C-x afunciona para o Zsh. Também testado no OS X.
Blaz 5/10

Se você está procurando simplesmente Ctrl + algo, onde algo pode ser a chave "x", você pode fazê-lo assim, em alguns sistemas: Control-x: history-and-alias-expand-line.
Igordcard 14/11

1
@ WeijunZhou: Isso depende do seu gerenciador de janelas e de quaisquer configurações personalizadas que você tiver. Para o Gnome, por exemplo, a tela de bloqueio é Super + L.
Dennis Williamson

2

Na verdade, isso pode ser uma maneira muito mais simples de fazer o que você está tentando ( bashversão> = 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


3
Isto está errado. As opções de shell "direxpand" e "expand_aliases" não ajudam a expandir os aliases inline, como a pergunta especifica. Não sei de qual chapéu "direxpand" foi tirado ...? Por padrão, "expand_aliases" já está definido. Se você desmarcá-lo, o resultado é basicamente desativar o funcionamento de aliases (eles não são expandidos antes da interpretação da linha de comando). Por exemplo, dado um pseudônimo, alias ll='ls -lo shell interpretaria 'll' como comando / função 'll' que provavelmente não existe.
FooF

0

Isso não funciona. Mas estou supondo / esperando que algo assim possa ser feito para fazer o que você quer fazer. Você precisaria usar seu próprio script de conclusão. É assim que você cria um:

_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

Agora, crie o arquivo bash_completion completo ( http://caliban.org/bash ) e coloque o script mencionado acima em um arquivo dentro do diretório bash_completion.d ao qual o script que você obtém das referências de URL. Deixe-me saber se não funcionar.

Obrigado.


0

Para quem tem o zsh instalado procurando uma solução simples, globalias pode ser seu amigo

Expande todas as expressões, subcomandos e aliases globais (incluindo globais).

# .zsrc:
alias S="sudo systemctl"

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

para instalar basta adicionar "globalias" à sua lista de plugins .zshrc

plugins=(... globalias)

Em seguida, basta pressionar SPACEpara ativar a expansão de um comando que você escreveu.

Se você deseja inserir apenas um espaço sem expandir a linha de comando, pressione CTRL+SPACE

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.